2016-10-01 69 views
0

我正在研究與攝像機標定有關的問題。在下圖中,我們考慮一個世界座標系,其中X軸向左,Y軸向右,Z軸向上。我們選擇15個點(x,y,z)均勻分佈在3個平面上。網格線之間的距離是1英寸。我們還獲得了15個像素(u,v)的MATLAB座標。其目的是使用均勻線性最小二乘法獲得3×4相機矩陣(M),然後使用M將這些世界點(x,y,z)投影到圖像(u',v')上。我已經編寫了代碼來完成此操作但是我得到的座標(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的世界座標((7,0,1)而不是(1,0,1))。這導致錯誤地形成了30x12矩陣,我們用它來形成一個方程,由齊次線性最小二乘法來求解。在糾正這個錯誤之後,我已經獲得了校準矩陣,該矩陣投影具有低RMS誤差的3D點。 enter image description here