如何使用 OpenCV triangulatePoints

2024-04-06

我正在努力获取 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 或光流无关,因为我测试了多个帧,它们都产生相同类型的输出。我真的认为这与三角测量本身有关。


triangulatePoints() 适用于立体相机,不适用于单目相机!

在 opencv 文档中,我读到了以下表达:

该函数通过使用观测值来重建 3 维点(在齐次坐标中)stereo camera。投影矩阵可以从stereoRectify()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 OpenCV triangulatePoints 的相关文章

随机推荐