我正在解决与相机校准相关的问题。在下图中,我们考虑一个世界坐标系,X轴向左,Y轴向右,Z轴向上。我们选择在3个平面上均匀分布的15个点(x,y,z)。网格线之间的距离为1英寸。我们还获得了15个像素(u,v)的MATLAB坐标。目标是使用均匀线性最小二乘法获得3x4相机矩阵(M),然后使用M将世界点(x,y,z)投影到图像(u',v')。我已编写代码来执行此操作但是我得到的坐标(u',v')的幅度与实际坐标(u,v)相比似乎非常小。 RMS误差太大,投影点甚至无法映射到实际点附近的图像上。是否需要进行任何缩放才能将其转换为MATLAB坐标?我也包括我编写的代码,因为我对MATLAB相对较新。
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分包括图像。取P1(u,v)=(286,260)和P1(x,y,z)=(4,0,3)。我为此获得的(u',v')值很低。谁能指出我做错了什么?