我正在尝试使用一系列 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
不知何故选择了错误R
并t
在某些步骤上签名。因此,本应前进的轨迹又回到了原点。然后再往前走。
我为改善这种情况所做的工作是:
1)跳过有太多异常值的帧(我在使用后findEssentialMat
和使用后都检查过recoverPose
)
2) 将 RANSAC 方法的阈值设置为findEssentialMat
0.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 检测到(我使用了这个实现)。所以代码的第一部分检测物体,第二部分使用检测到的特征点来恢复轨迹。