【发布时间】:2017-10-15 20:33:13
【问题描述】:
我目前正在尝试在给定一组世界点 (X) 及其对应的图像点 (x) 的情况下计算相机矩阵 P。但是,在测试结果时,P(3 x 4 相机矩阵)乘以世界点并没有给我正确的对应图像点。但是,只有第一列 PX = x。另一列不会返回近似图像点。
代码:
X = [1 2 3; 4 5 6; 7 8 9; 1 1 1];
x = [3 2 1; 6 5 4; 1 1 1];
[mX, nX] = size(X);
[mx, nx] = size(x);
for i = 0:(nX-1)
XX{i+1} = transpose(X(1+i: 4+i));
end
for i = 0:(nx-1)
xx{i+1} = transpose(x(i+1:3+i));
end
%TODO - normalization
A = [];
%construct matrix
for i = 1:nX
A = [A; zeros(1,4) -1*(xx{i}(3)*transpose(XX{i})) xx{i}(2)*transpose(XX{i})];
A = [A; xx{i}(3)*transpose(XX{i}) zeros(1,4) -1*xx{i}(1)*transpose(XX{i})];
end
%using svd to solve for non zero solution
[u s v] = svd(A);
p = v(:, size(v,2));
p = reshape(p, 4,3)';
第一列的输出,效果很好:
>> p*XX{1}
ans =
0.0461
0.0922
0.0154
>> ans/0.0154
ans =
2.9921
5.9841
0.9974
>> xx{1}
ans =
3
6
1
第二列的输出,不起作用:
>> p*XX{2}
ans =
0.5202
0.0867
0.1734
>> ans/0.1734
ans =
2.9999
0.5000
1.0000
>> xx{2}
ans =
6
1
2
顺便说一句,有人告诉我,在计算相机矩阵之前,我需要对世界点和图像点进行归一化。我没有完成这一步,也不知道怎么做。如果这是导致问题的原因,请说明可以采取的措施。先感谢您。
【问题讨论】:
-
请人!
-
x(i+1:3+i)中的索引可能有误。在命令窗口中单独运行此部分。这就是你想要的吗? -
我回答你的问题了吗?
-
@rayryeng 是的,现在效果很好!感谢您的详尽回答。非常感谢!
-
@xiavinson 完全没有问题。如果你喜欢我可以谈谈为什么你需要标准化点。但是,我觉得这应该是一个单独的问题。在这种特殊情况下,2D 和 3D 点之间的值的大小大致相同,因此不需要标准化。
标签: matlab matrix camera computer-vision projection