相机校准:3D 到 2D 点映射
Camera calibration: 3D to 2D points mapping
我正在处理与相机校准相关的问题。在下图中,我们考虑一个 X 轴向左,Y 轴向右,Z 轴向上的世界坐标系。我们 select 15 个点 (x,y,z) 均匀分布在 3 个平面上。网格线之间的距离为 1 英寸。我们还获得了 15 个像素 (u,v) 的 MATLAB 坐标。 objective 是使用齐次线性最小二乘法获得 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')
我还包括了我 selected 的 15 个点的图像。取 P1(u,v) = (286,260) 和 P1(x,y,z) = (4,0,3)。我为此获得的 (u',v') 值很低。谁能指出我做错了什么?
给我错误的相机矩阵是我犯的一个愚蠢的错误。我错误地记下了点 P 的世界坐标((7,0,1) 而不是 (1,0,1))。这导致了错误形成的 30x12 矩阵,我们用它来形成一个方程,用齐次线性最小二乘法求解。在更正此错误后,我获得了以低 RMS 误差投影 3D 点的校准矩阵。
我正在处理与相机校准相关的问题。在下图中,我们考虑一个 X 轴向左,Y 轴向右,Z 轴向上的世界坐标系。我们 select 15 个点 (x,y,z) 均匀分布在 3 个平面上。网格线之间的距离为 1 英寸。我们还获得了 15 个像素 (u,v) 的 MATLAB 坐标。 objective 是使用齐次线性最小二乘法获得 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')
我还包括了我 selected 的 15 个点的图像。取 P1(u,v) = (286,260) 和 P1(x,y,z) = (4,0,3)。我为此获得的 (u',v') 值很低。谁能指出我做错了什么?
给我错误的相机矩阵是我犯的一个愚蠢的错误。我错误地记下了点 P 的世界坐标((7,0,1) 而不是 (1,0,1))。这导致了错误形成的 30x12 矩阵,我们用它来形成一个方程,用齐次线性最小二乘法求解。在更正此错误后,我获得了以低 RMS 误差投影 3D 点的校准矩阵。