我很难让OpenCV的triangulatePoints函数正常工作。我正在使用由光流生成的点匹配来调用该函数。我使用单个移动相机的两个连续帧/位置来调用该函数。
目前我的步骤如下:
给定相机内参,看起来是符合预期的:
我会很乐意为您翻译IT技术相关内容。需要翻译的内容如下:
这将导致:
为了计算3D点,我将图像点(以OpenCV期望的格式)和投影矩阵输入到
最后,我通过将
最终得到的是一些奇怪的锥形点云:
现在我尝试了我能想到的所有调整组合(矩阵求逆、改变X/Y/Z顺序、翻转X/Y/Z轴、改变乘法顺序等),但所有的结果都类似奇怪的输出。唯一让我得到更好结果的事情是将光流值乘以0.01。这会产生以下点云:
这仍然不完美(远离相机的区域看起来非常弯曲),但更接近我的预期。
我想知道是否有人能发现我做错了什么。我的矩阵看起来还好吗?我得到的输出与某个问题相关吗?
我很确定这与GPS或光流无关,因为我测试了多个帧,它们都产生相同类型的输出。我真的认为这与三角测量本身有关。
目前我的步骤如下:
给定相机内参,看起来是符合预期的:
2.6551e+003 0. 1.0379e+003
0. 2.6608e+003 5.5033e+002
0. 0. 1.
我会很乐意为您翻译IT技术相关内容。需要翻译的内容如下:
然后,我基于(高度精确的)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)并移除此坐标来将其从齐次坐标转换为笛卡尔坐标系。最终得到的是一些奇怪的锥形点云:
![Output 1](https://istack.dev59.com/cyZ7K.webp)
![Output 2](https://istack.dev59.com/hIELk.webp)
我想知道是否有人能发现我做错了什么。我的矩阵看起来还好吗?我得到的输出与某个问题相关吗?
我很确定这与GPS或光流无关,因为我测试了多个帧,它们都产生相同类型的输出。我真的认为这与三角测量本身有关。