2016-10-01 2 views
0

카메라 보정과 관련된 문제를 해결하고 있습니다. 아래 이미지에서 X 축이 왼쪽, Y 축이 오른쪽, Z 축이 위를 향한 세계 좌표계를 고려합니다. 3 개의 평면에 걸쳐 균일하게 분포 된 15 점 (x, y, z)을 선택합니다. 격자 선 사이의 거리는 1 인치입니다. 우리는 또한 15 픽셀 (u, v)에 대한 MATLAB 좌표를 얻습니다. 목적은 균일 한 선형 최소 제곱을 사용하여 3x4 카메라 행렬 (M)을 얻은 다음 M을 사용하여 이미지 (u ', v')에 월드 포인트 (x, y, z)를 투영하는 것입니다. 그러나 (u ', v')를 얻는 좌표는 실제 좌표 (u, v)와 비교할 때 매우 작게 보인다. RMS 오류가 너무 커서 투영 된 점이 실제 점 근처의 이미지에 매핑되지 않습니다. 그것을 MATLAB 좌표로 변환하기 위해 스케일링이 필요합니까? 나는 또한 MATLAB에 비교적 익숙하지 않기 때문에 잘 작성되지 않은 코드를 포함하고 있습니다. Grid image카메라 보정 : 3D에서 2D 로의 점 매핑

P=[];% 2nx12 matrix - 30x12 matrix 
for i=1:15 %compute P 
    world_row = world_coords(i,:); % 3d homogeneous coordinates (x,y,z,1) 
    zeroelem = repelem(0,4); 
    image_coord = image_coords(i,:); 
    img_u = image_coord(1); 
    prod = -img_u*world_row; 
    row1 = [world_row,zeroelem,prod]; 
    zeroelem = repelem(0,3); 
    img_v = image_coord(2); 
    prod = -img_v*world_row; 
    row2 = [0,world_row,zeroelem,prod]; 
    P=[P;row1;row2]; 
    end 
var1 = P'*P; 
[V,D] = eig(var1');//compute eigen vector corresponding to least eigen value 
m = V(:,1); //unit vector of norm 1 
M = reshape(m,3,4); //camera matrix of 3x4 size 
%get projected points 
proj = M*world_coords'; 
U = proj (1,:); 
V = proj (2,:); 
W = proj (3,:); 
for i=1:15 
    U(i) = U(i)/W(i); 
    V(i) = V(i)/W(i); 
end 
final = [U;V];//(u',v') 

15 points across the 3 planes

나는 또한 내가 선택한 15 점으로 이미지를 포함하고있다. P1 (u, v) = (286,260) 및 P1 (x, y, z) = (4,0,3)을 취한다. 이것으로 얻은 (u ', v') 값은 작습니다. 아무도 내가 잘못하고있는 것을 지적 할 수 있습니까?

답변

0

내 카메라에서 잘못된 카메라 매트릭스를 제공하는 바보 같은 오류입니다. 나는 포인트 P의 좌표를 잘못 ((1,0,1) 대신에 (7,0,1)) 잘못 지적했다. 이것은 균질 한 선형 최소 제곱으로 풀 수있는 방정식을 만들기 위해 잘못 형성된 30x12 매트릭스를 만들었습니다. 이 오류를 수정 한 후 낮은 RMS 오류로 3D 포인트를 투영하는 교정 매트릭스를 얻었습니다. enter image description here