如何在单个移动相机中使用 cv2.triangulatePoints

问题描述

我有一个可以四处移动的相机。我有每个相机方向的内在参数矩阵和外在参数矩阵。对于对象检测,我使用 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 帧的时间间隔还是使用这种方法使用单个相机定位对象永远不准确?

解决方法

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

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

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