我正在尝试从2D图像对应中重建3D点。我的相机已经过校准。测试图像是方格立方体,并且手工采集对应物。径向失真被消除。在三角测量之后,施工似乎是错误的。 X和Y值似乎是正确的,但Z值大致相同,并且不会沿着立方体区分。 3D点看起来好像这些点沿着Z轴变平。
Z值出了什么问题?这些点是否需要在任何点从图像坐标进行归一化或更改,比如在计算基本矩阵之前? (如果这太模糊,我可以解释我的一般过程或详细说明部分)
更新
给定:
x1 = P1 * X
和x2 = P2 * X
x1
,x2
是第一个和第二个图像点,X
是3d点。
但是,我发现x1
与实际的手选值并不接近,但x2
实际上是接近的。
我如何计算投影矩阵:
P1 = [eye(3), zeros(3,1)];
P2 = K * [R, t];
更新II
优化后的校准结果(有不确定性)
% Focal Length: fc = [ 699.13458 701.11196 ] ± [ 1.05092 1.08272 ]
% Principal point: cc = [ 393.51797 304.05914 ] ± [ 1.61832 1.27604 ]
% Skew: alpha_c = [ 0.00180 ] ± [ 0.00042 ] => angle of pixel axes = 89.89661 ± 0.02379 degrees
% Distortion: kc = [ 0.05867 -0.28214 0.00131 0.00244 0.35651 ] ± [ 0.01228 0.09805 0.00060 0.00083 0.22340 ]
% Pixel error: err = [ 0.19975 0.23023 ]
%
% Note: The numerical errors are approximately three times the standard
% deviations (for reference).
-
K =
699.1346 1.2584 393.5180
0 701.1120 304.0591
0 0 1.0000
E =
0.3692 -0.8351 -4.0017
0.3881 -1.6743 -6.5774
4.5508 6.3663 0.2764
R =
-0.9852 0.0712 -0.1561
-0.0967 -0.9820 0.1624
0.1417 -0.1751 -0.9743
t =
0.7942
-0.5761
0.1935
P1 =
1 0 0 0
0 1 0 0
0 0 1 0
P2 =
-633.1409 -20.3941 -492.3047 630.6410
-24.6964 -741.7198 -182.3506 -345.0670
0.1417 -0.1751 -0.9743 0.1935
C1 =
0
0
0
1
C2 =
0.6993
-0.5883
0.4060
1.0000
% new points using cpselect
%x1
input_points =
422.7500 260.2500
384.2500 238.7500
339.7500 211.7500
298.7500 186.7500
452.7500 236.2500
412.2500 214.2500
368.7500 191.2500
329.7500 165.2500
482.7500 210.2500
443.2500 189.2500
402.2500 166.2500
362.7500 143.2500
510.7500 186.7500
466.7500 165.7500
425.7500 144.2500
392.2500 125.7500
403.2500 369.7500
367.7500 345.2500
330.2500 319.7500
296.2500 297.7500
406.7500 341.2500
365.7500 316.2500
331.2500 293.2500
295.2500 270.2500
414.2500 306.7500
370.2500 281.2500
333.2500 257.7500
296.7500 232.7500
434.7500 341.2500
441.7500 312.7500
446.2500 282.2500
462.7500 311.2500
466.7500 286.2500
475.2500 252.2500
481.7500 292.7500
490.2500 262.7500
498.2500 232.7500
%x2
base_points =
393.2500 311.7500
358.7500 282.7500
319.7500 249.2500
284.2500 216.2500
431.7500 285.2500
395.7500 256.2500
356.7500 223.7500
320.2500 194.2500
474.7500 254.7500
437.7500 226.2500
398.7500 197.2500
362.7500 168.7500
511.2500 227.7500
471.2500 196.7500
432.7500 169.7500
400.2500 145.7500
388.2500 404.2500
357.2500 373.2500
326.7500 343.2500
297.2500 318.7500
387.7500 381.7500
356.2500 351.7500
323.2500 321.7500
291.7500 292.7500
390.7500 352.7500
357.2500 323.2500
320.2500 291.2500
287.2500 258.7500
427.7500 376.7500
429.7500 351.7500
431.7500 324.2500
462.7500 345.7500
463.7500 325.2500
470.7500 295.2500
491.7500 325.2500
497.7500 298.2500
504.7500 270.2500
更新III
请参阅答案进行更正。上面计算的答案使用了错误的变量/值。
答案 0 :(得分:5)
**注意所有参考文献都是Hartley和Zisserman在计算机视觉中的多视图几何。
好的,所以有几个错误:
当计算基本矩阵(第257-259页)时,作者提到正确的R,t对来自四个R的集合,t(结果9.19)是3D点位于前面的那个两个摄像头(图9.12,a)但没有提到如何计算这个。我偶然重读了第6章,发现6.2.3(第162页)讨论了点的深度,结果6.1是需要应用以获得正确的R和t的公式。
在我执行步骤2中的最佳三角测量方法(算法12.1(第318页))时,我需要T2^-1' * F * T1^-1
,我需要(T2^-1)' * F * T1^-1
。前者翻译-1.I想要,而在后者中,翻译T2的矩阵(由MATLAB再次挫败!)。
最后,我没有正确计算P1,它应该是P1 = K * [eye(3),zeros(3,1)];
。我通过校准矩阵K忘了多次。
希望这有助于未来的路人!
答案 1 :(得分:1)
可能是您的积分处于退化配置中。尝试从场景中添加不属于多维数据集的几个点并查看它是如何进行的。
答案 2 :(得分:1)
需要更多信息:
x1
和x2
之间的差异是什么?我确信我们可以解决这个问题:)