【问题标题】:How to use cv2.triangulatePoints with a single moving camera如何将 cv2.triangulatePoints 与单个移动相机一起使用
【发布时间】:2021-02-08 13:51:45
【问题描述】:

我有一个可以移动的相机。我有每个相机方向的内在参数矩阵和外在参数矩阵。对于对象检测,我使用 YOLO,并在图像平面中获得 2D 边界框。我的计划是使用一对时间图像,其中包含检测到的对象,对对象周围生成的 2D 边界框的中点进行三角测量。

现在,我使用相隔 5 帧的两张图片。这意味着,第一帧中有对象,第二帧在几毫秒后有相同的对象。我使用 cv2.triangulatePoints 来获取边界框 2D 中点对应的 3D 点。

我的主要问题是当相机或多或少稳定时,得到的距离值是准确的(在几厘米内)。但是,当我四处移动相机时,对象的最终距离值开始变化很大(对象是静态的,从不移动,只有看着它的相机移动)。我似乎无法理解为什么会这样。

对于 cv2.triangulatePoints,我得到两个时间相机方向之间的相对旋转矩阵 (R = R2R1),然后得到相对平移 (t = t2 - Rt1)。 P1 和 P2 是最终的投影矩阵(P1 表示较早位置的相机,P2 表示较晚位置的相机)。 P1 = K[I|0] 和 P2 = K[R|t],其中 K 是 3x3 内参矩阵,I 是 3x3 单位矩阵,0 是 3x1 零向量。

我应该使用 10 帧的时间间隔,还是使用这种方法通过单个相机定位对象永远不准确?

【问题讨论】:

  • 该方法应该适用于恕我直言。你可以多解释一下“结果距离值”吗?是重投影错误吗?
  • 距离值是第一帧中中心到相机的距离。我在 5 帧之前的相机参考框架中获得中心,但由于相机一直在移动,我将所有 3D 坐标带入第一帧中相机的参考框架。

标签: python deep-learning computer-vision opencv-python 3d-reconstruction


【解决方案1】:

边界框的中心不能保证是单个场景 (3d) 点的投影,即使有完美的轨迹,除非添加了额外的约束。例如,被跟踪对象是平面的,或者边界框的顶点跟踪平面上的点。当存在跟踪错误时,事情会变得更加复杂。

如果您确实需要对盒子中心进行三角测量(是吗?您确定仅使用匹配良好的投影就无法实现目标吗?),您可以在一个盒子中使用围绕中心的一小块区域作为模式,并在第二张图像中使用 point 跟踪器(例如,一个基于 Lucas-Kanade 算法,或一个基于归一化互相关)跟踪它,使用第二个框来约束跟踪器搜索窗口.

那么您可能需要解决相机运动估计的准确性问题 - 如果误差很大,您的三角测量将无济于事。捆绑调整可能需要成为您的朋友。

【讨论】:

  • 我试图本地化的对象非常小。因此,第 1 帧中 2D 边界框的中点距离第 5 帧(甚至第 10 帧)中同一对象的中点并没有那么远。 3D坐标(在第一帧的参考帧中获得)不应该非常接近吗?
  • 另外,为了验证,我使用第 n 帧和第 n-5 帧将 2D 边界框的中点定位在第 n-5 帧的参考坐标中。为了在第 1 帧(第一帧)的参考坐标中进行定位,我使用与在第 n 帧和第 n-5 帧获取相机投影矩阵相同的方法。
  • 如果不查看您的图像和轨迹,目前很难判断。相机姿势的链接是简单的数学运算,我唯一的建议是,当链接长序列(例如> 10帧)时,您应该避免乘以旋转矩阵,或定期重新正交化 - 最佳做法是使用四元数。
猜你喜欢
  • 2021-02-24
  • 2022-08-18
  • 1970-01-01
  • 2021-01-23
  • 2019-04-29
  • 2014-07-29
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多