OpenCV triangulatePoints变化的距离

anc*_*jic 7 c++ opencv

我正在使用OpenCV的triangulatePoints功能来确定由立体相机成像的点的3D坐标.

我正在经历这个功能根据相机到该点的角度给出了不同距离到同一点.

这是一段视频:https: //www.youtube.com/watch?v = FrYBhLJGiE4

在此视频中,我们正在跟踪"X"标记.在左上角显示有关正在跟踪的点的信息.(Youtube降低了质量,视频通常更清晰.(2x1280)x 720)

在视频中,左侧相机是3D坐标系的原点,它正向Z方向看.左相机正在进行一些翻译,但几乎没有triangulatePoints功能导致相信.(更多信息在视频说明中.)

公制单位为mm,因此该点最初在距离左相机约1.94m处进行三角测量.

我知道不够精确的校准会导致这种行为.我使用棋盘图案运行了三次独立校准.由此产生的参数因我的口味而变化太大.(焦距估计约为±10%).

如您所见,视频没有严重失真.直线在任何地方看起来都非常直.因此,最佳摄像机参数必须接近我已经使用的参数.

我的问题是,还有什么能够导致这种情况吗?

两个立体相机之间的会聚角度可以产生这种效果吗?或错误的基线长度?

当然,特征检测总是存在错误.由于我使用光流来跟踪'X'标记,我得到亚像素精度,这可能会被误解......我不知道...... + -0.2 px?

我正在使用Stereolabs ZED立体相机.我不是直接使用OpenCV访问视频帧.相反,我必须使用购买相机时获得的特殊SDK.我发现这个我正在使用的SDK 可能正在做一些不成比例的事情.

所以,现在我想知道......如果SDK使用不正确的失真系数来解决图像,那么这可以创建既不是桶形失真也不是枕形失真但完全不同的图像?

fir*_*ant 1

我能想到的有3点,也许可以帮助你。

  1. 可能是最不重要的,但从你的描述来看,你已经分别校准了相机和立体声系统。运行整体优化应该可以提高重建精度,因为一些“不太准确”的参数可以补偿其他“不太准确”的参数。

  2. 如果重建的准确性对您来说很重要,那么您需要采用系统的方法来降低重建的准确性。由于数学模型,构建不确定性模型很容易,并且可以编写几行代码来为您构建它。假设您想查看 3d 点是否在 2 米外,与相机系统成特定角度,并且您对 3d 点的 2d 投影有特定的不确定性,则可以轻松地将不确定性反投影到您周围的 3d 空间3d 点。通过向系统的其他参数添加不确定性,您可以看到哪些参数更重要并且需要降低不确定性。

  3. 这种不准确性是问题和您所使用的方法所固有的。

    • 首先,如果您对不确定性进行建模,您将看到远离摄像机中心的重建 3d 点具有更高的不确定性。原因是角度<left-camera, 3d-point, right-camera>更窄。我记得MVG书对此有很好的描述,并用图表示。
    • 其次,如果您查看 的实现,triangulatePoints会发现伪逆方法是使用 SVD 来构造 3d 点来实现的。这可能会导致许多问题,您可能还记得线性代数中的这些问题。

更新:

但我总是在边缘附近获得更大的距离,并且由角度引起的不确定性的大小是数倍。

这是使用伪逆(一种数值方法)的结果。您可以用几何方法代替它。一种简单的方法是对 2d 投影进行反投影以在 3d 空间中获得 2 条光线。然后你想找到相交的地方,但由于不准确,这种情况不会发生。相反,您想要找到两条射线距离最小的点。如果不考虑不确定性,您将始终倾向于从一组可行解决方案中选择一个点。这就是为什么使用伪逆你看不到任何波动,而是看到一个严重的错误。

关于一般优化,是的,您可以对所有参数运行迭代 LM 优化。这是自动驾驶汽车 SLAM 等应用中使用的方法,其中准确性非常重要。您可以通过谷歌搜索找到一些论文bundle adjustment slam