我正在努力获取 OpenCVtriangulatePoints
功能来工作。我正在使用该函数与光流生成的点匹配。我使用来自单个移动摄像机的两个连续帧/位置。
目前,这些是我的步骤:
给出了内在函数,看起来就像人们所期望的那样:
2.6551e+003 0. 1.0379e+003
0. 2.6608e+003 5.5033e+002
0. 0. 1.
然后,我根据(高精度)GPS 和相机相对于 GPS 的位置来计算两个外在矩阵 ([R|t])。请注意,GPS 数据使用荷兰周围的笛卡尔坐标系,该坐标系使用米作为单位(因此不需要奇怪的纬度/经度数学)。这会产生以下矩阵:
接下来,我只需删除这些矩阵的底行并将它们与内在矩阵相乘即可得到投影矩阵:
projectionMat = intrinsics * extrinsics;
这导致:
我的图像点仅由第一组的所有像素坐标组成,
(0, 0)...(1080, 1920)
以及第二组的所有像素坐标+其计算的光流。
(0 + flowY0, 0 + flowX0)...(1080 + flowYN, 1920 + flowXN)
为了计算 3D 点,我将图像点(以 OpenCV 期望的格式)和投影矩阵提供给triangulatePoints
功能:
cv::triangulatePoints(projectionMat1, projectionMat2, imagePoints1, imagePoints2, outputPoints);
最后,我将outputPoints
通过将它们除以第四个坐标 (w) 并删除该坐标,从齐次坐标中得到。
我最终得到的是一些奇怪的锥形点云:
现在我已经尝试了我能想到的所有调整组合(反转矩阵、更改 X/Y/Z 顺序、反转 X/Y/Z 轴、更改乘法顺序...),但一切都会产生类似奇怪的结果。有一件事是did给我更好的结果只需将光流值乘以 0.01。这会产生以下点云:
这仍然不完美(远离相机的区域看起来确实弯曲),但更像我所期望的。
我想知道是否有人能发现我做错了什么。我的矩阵看起来还好吗?我得到的输出与某个问题有关吗?
我非常确定的是,它与 GPS 或光流无关,因为我测试了多个帧,它们都产生相同类型的输出。我真的认为这与三角测量本身有关。