首页 > 解决方案 > 如何改进由旋转和平移构建的相机轨迹?

问题描述

我正在尝试使用一系列 2D 图像和 OpenCV 来恢复 2D 相机的轨迹。但我得到的轨迹并不像我希望的那么好。它来回走动,而不是向前走。

我在 2D 相机移动时拍摄了一系列照片(KITTI 数据集,即户外部分)。对于每两个连续的帧,我用 和 计算旋转矩阵(R)和平移向量(t) ,E = cv2.findEssentialMat()然后cv2.recoverPose(E, ...)我估计轨迹,假设每个平移向量的坐标在局部坐标系中给出,该位置由相应的设置旋转矩阵。

upd:每个恢复的位置看起来像 [X,Y,Z],我为每个 i 分散 (X_i, Y_i)(这些点被认为是 2D 位置),所以下面的图表是我估计的轨迹。

是我得到的,而不是直线(相机直线向前移动)。以前的结果更糟

绿点是开始的地方,红点是结束的地方。所以大多数时候它甚至会倒退。不过,这可能是因为一开始的一个错误,这是一切都好转的原因(对吧?)

这就是我所做的:

E, mask = cv2.findEssentialMat(points1, points2, K_00, cv2.RANSAC, 0.99999, 0.1)

inliers, R, t, mask = cv2.recoverPose(E, points1, points2, K_00, R, t, mask)

在我看来,recoverPose不知何故选择了错误Rt在某些步骤上签名。因此,本应前进的轨迹又回到了原点。然后再往前走。

我为改善这种情况所做的工作是:

1)跳过有太多异常值的帧(我在使用后findEssentialMat和使用后都检查过recoverPose

2) 将 RANSAC 方法的阈值设置为findEssentialMat0.1

3) 将每幅图像上的特征点数量从 8 个增加到 24 个。

这并没有真正帮助。

这里需要注意的是:我知道在实践中,用于计算本质矩阵的5点算法需要的点数比8个甚至24个要多得多。也许这实际上是问题所在。

所以问题是:

1) 特征点的数量(大约 8-24 个)是否会成为恢复姿势错误的原因?

2)如果检查异常值的数量是否正确,那么我应该将异常值的百分比设置为限制?

3)我估计这样的职位(而不是简单的p[i+1] = R*p[i]+t):

C = np.dot(R, C)
p[i+1] = p[i] + np.dot(np.linalg.inv(C), t)

这是因为我不禁将t其视为局部坐标中的向量,C变换矩阵也是如此,它在每一步都更新以总结旋转。这是对还是不对?

4)我真的有可能遗漏了一些东西,因为我对该主题的了解似乎很少。有什么(任何东西!)你可以推荐的吗?

非常感谢您的宝贵时间!我会很感激任何建议。

upd:例如,这是我得到的前六个旋转矩阵平移向量恢复的位置。的迹象t似乎有点疯狂。

更新:这是我的代码。(我还不是一个真正好的程序员)。主要思想是我的特征点是静态对象边界框的角,我用 Faster R-CNN 检测到(我使用了这个实现)。所以代码的第一部分检测物体,第二部分使用检测到的特征点来恢复轨迹。

这是我使用的数据集(这是此处的 2011_09_26_drive_0005 部分)。

标签: pythonopencvcomputer-visionpose-estimationslam

解决方案


推荐阅读