我有一个小问题。我编写了一个程序,它使用相机和深度信息在每一帧中提取一组三维点。这些点在相机坐标系中,这意味着原点在相机中心,x 是水平距离,y 是垂直距离,z 是到相机的距离(沿光轴)。一切都以米为单位。即点 (2,-1,5) 将位于右侧 2 米、下方 1 米和沿相机光轴的 5 米处。
我在每个时间范围内计算这些点并且也知道对应关系,就像我知道哪个点t-1
属于哪个 3d 点t
。
我现在的目标是在我的世界坐标系中计算相机在每个时间帧中的运动(z 向上代表高度)。我想计算相对运动,但也想计算从某个起始位置开始的绝对运动,以可视化相机的轨迹。
这是一帧的示例数据集,其中包含相机坐标中点的当前(左)和前一个 3D 位置(右):
-0.174004 0.242901 3.672510 | -0.089167 0.246231 3.646694
-0.265066 -0.079420 3.668801 | -0.182261 -0.075341 3.634996
0.092708 0.459499 3.673029 | 0.179553 0.459284 3.636645
0.593070 0.056592 3.542869 | 0.675082 0.051625 3.509424
0.676054 0.517077 3.585216 | 0.763378 0.511976 3.555986
0.555625 -0.350790 3.496224 | 0.633524 -0.354710 3.465260
1.189281 0.953641 3.556284 | 1.274754 0.938846 3.504309
0.489797 -0.933973 3.435228 | 0.561585 -0.935864 3.404614
由于我想尽可能使用 OpenCV,因此我estimateAffine3D()
在 OpenCV 2.3 中找到了该函数,该函数采用两个 3D 点输入向量并使用 RANSAC 计算它们之间的仿射变换。
作为输出,我得到一个 3x4 变换矩阵。
我已经尝试通过设置 RANSAC 参数来使计算更准确,但很多时候转换矩阵显示出相当大的平移运动。正如您在示例数据中看到的那样,移动通常非常小。
所以我想问是否有人对我可以尝试什么有其他想法?OpenCV 是否为此提供其他解决方案?
另外,如果我在每个时间范围内都有相机的相对运动,我将如何将其转换为世界坐标?另外,我将如何获得从点 (0,0,0) 开始的绝对位置,以便我拥有每个时间帧的相机位置(和方向)?
如果有人能给我一些建议,那就太好了!
谢谢!
更新 1:
在@Michael Kupchick 很好的回答之后,我尝试检查OpenCV 中的estimateAffine3D() 函数的工作情况。因此,我创建了两个包含 6 个点对的小测试集,它们只有平移,而不是旋转,并查看了生成的变换矩阵:
测试集 1:
1.5 2.1 6.7 | 0.5 1.1 5.7
6.7 4.5 12.4 | 5.7 3.5 11.4
3.5 3.2 1.2 | 2.5 2.2 0.2
-10.2 5.5 5.5 | -11.2 4.5 4.5
-7.2 -2.2 6.5 | -8.2 -3.2 5.5
-2.2 -7.3 19.2 | -3.2 -8.3 18.2
转换矩阵:
1 -1.0573e-16 -6.4096e-17 1
-1.3633e-16 1 2.59504e-16 1
3.20342e-09 1.14395e-09 1 1
测试集 2:
1.5 2.1 0 | 0.5 1.1 0
6.7 4.5 0 | 5.7 3.5 0
3.5 3.2 0 | 2.5 2.2 0
-10.2 5.5 0 | -11.2 4.5 0
-7.2 -2.2 0 | -8.2 -3.2 0
-2.2 -7.3 0 | -3.2 -8.3 0
转换矩阵:
1 4.4442e-17 0 1
-2.69695e-17 1 0 1
0 0 0 0
--> 这给了我两个乍看之下正确的转换矩阵......
假设这是正确的,当我在每个时间步中都有这个变换矩阵时,我将如何重新计算它的轨迹?
任何人有任何提示或想法,为什么它那么糟糕?