如何使用OpenCV triangulatePoints

Wou*_*ijn 7 c++ opencv triangulation

我正在努力让OpenCV triangulatePoints功能起作用.我正在使用从光流生成的点匹配功能.我正在使用一个移动相机的两个连续帧/位置.

目前这些是我的步骤:

给出了内在函数,看起来像人们期望的那样:

2.6551e+003  0.           1.0379e+003
0.           2.6608e+003  5.5033e+002
0.           0.           1.
Run Code Online (Sandbox Code Playgroud)

然后,我基于(高度精确的)GPS和相对于GPS的摄像机位置计算两个外部矩阵([R | t]).请注意,GPS数据使用荷兰周围的笛卡尔坐标系,该坐标系使用米作为单位(因此不需要奇怪的lat/lng数学运算).这产生以下矩阵:

相机外在矩阵

接下来,我简单地删除这些矩阵的底行并将它们与内在矩阵相乘以得到投影矩阵:

projectionMat = intrinsics * extrinsics;
Run Code Online (Sandbox Code Playgroud)

这导致:

投影矩阵

我的图像点只包含第一组的所有像素坐标,

(0, 0)...(1080, 1920)
Run Code Online (Sandbox Code Playgroud)

和所有像素坐标+他们计算的第二组光流.

(0 + flowY0, 0 + flowX0)...(1080 + flowYN, 1920 + flowXN)
Run Code Online (Sandbox Code Playgroud)

为了计算3D点,我将图像点(以OpenCV期望的格式)和投影矩阵提供给triangulatePoints函数:

cv::triangulatePoints(projectionMat1, projectionMat2, imagePoints1, imagePoints2, outputPoints);
Run Code Online (Sandbox Code Playgroud)

最后,我将outputPoints齐次坐标转换为它们的第四个坐标(w)并删除该坐标.

我最终得到的是一些奇怪的锥形点云:

输出1

现在我已经尝试了我能想到的每种调整组合(反转矩阵,改变X/Y/Z顺序,反转X/Y/Z轴,改变乘法顺序......),但是一切都会产生类似奇怪的结果.确实给我带来更好结果的一件事就是将光流值乘以0.01.这导致以下点云:

输出2

这仍然不是很完美(远离相机的区域看起来非常弯曲),但更像我期望的那样.

我想知道是否有人能发现我做错了什么.我的矩阵看起来不错吗?输出我是否与某个问题有关?

我非常肯定的是,它与GPS或光流无关,因为我测试了多个帧,它们都产生相同类型的输出.我真的认为它与三角测量本身有关.

小智 1

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

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

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