Image 相机校准:三维到二维点映射

Image 相机校准:三维到二维点映射,image,matlab,linear-algebra,camera-calibration,Image,Matlab,Linear Algebra,Camera Calibration,我正在解决与摄像机校准相关的问题。在下面的图像中,我们考虑了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误差太大,投影点甚至无法映射到靠近实际点的

我正在解决与摄像机校准相关的问题。在下面的图像中,我们考虑了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。


我还包括我选择的15个点的图像。取P1(u,v)=(286260)和P1(x,y,z)=(4,0,3)。为此获得的(u',v')值较低。有人能告诉我我做错了什么吗?

我犯了一个愚蠢的错误,给了我错误的相机矩阵。我错误地记下了点P的世界坐标((7,0,1)而不是(1,0,1))。这导致错误形成30x12矩阵,我们使用该矩阵形成方程,并通过齐次线性最小二乘法进行求解。我已获得校准矩阵,该矩阵在纠正此错误后投影具有低RMS误差的3D点。
我犯了一个愚蠢的错误,给了我错误的相机矩阵。我错误地记下了点P的世界坐标((7,0,1)而不是(1,0,1))。这导致错误形成30x12矩阵,我们使用该矩阵形成方程,并通过齐次线性最小二乘法进行求解。我已获得校准矩阵,该矩阵在纠正此错误后投影具有低RMS误差的3D点。

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')