SOLVEPNP_EPNP 的相机姿势估计对异常值敏感吗?可以纠正吗?

Is camera pose estimation with SOLVEPNP_EPNP sensitive to outliers and can this be rectified?

我必须做一个作业,我应该在其中比较函数 solvePnP()SOLVEPNP_EPNP 一起使用以及 solvePnPRansac()SOLVEPNP_ITERATIVE 一起使用。目标是根据输入图像计算变形图像。

为此,我得到了一个 RGB 输入图像、与 16 位深度信息图像相同的图像、相机固有函数以及给定图像和想要的结果扭曲图像之间的特征匹配点列表(这是相同的不同视角的场景。

到目前为止,我是这样完成这项任务的:

  1. 从深度图像和与特征匹配列表相对应的内在函数中计算 3D 对象点列表。
  2. solvePnP()solvePnPRansac()与各自的算法一起使用,其中计算的3D对象点和结果图像的特征匹配点是输入。结果,我得到了两种方法的旋转和平移向量。
  3. 作为健全性检查,我使用 projectPoints() 计算所有特征匹配点的平均重投影误差,并将得到的投影点与结果图像的特征匹配点进行比较。
  4. 最后,我为输入图像的每个像素计算 3D 对象点,并使用之前的旋转和平移向量再次投影它们。每个投影点将从输入图像中的相应像素获取颜色,从而产生最终的变形图像。

这些是我的输入:

使用上述步骤,我使用 Ransac 方法得到以下输出: 这看起来非常像我的参考解决方案,所以这应该是基本正确的。 然而,对于使用 SOLVEPNP_EPNPsolvePnP() 方法,生成的旋转和平移向量看起来像这样,这根本没有意义:

================ solvePnP using SOVLEPNP_EPNP results: ===============

Rotation: [-4.3160208e+08; -4.3160208e+08; -4.3160208e+08]

Translation: [-4.3160208e+08; -4.3160208e+08; -4.3160208e+08]

作业 sheet 指出,特征匹配列表包含一些未匹配项,因此基本上是异常值。据我所知,Ransac 可以更好地处理异常值,但这是否是另一种方法出现这种奇怪结果的原因?我原以为会出现一些异常情况,但这是完全错误的,生成的图像完全是黑色的,因为图像区域内没有任何点。

也许有人可以为我指出正确的方向。

好的,我可以解决这个问题。我事先使用 float 进行所有计算(3D 对象点、匹配等),并尝试将所有内容更改为 double - 它成功了。

扭曲的视角仍然关闭,我得到了一个相当高的 re-projection 错误,但这应该是由于算法本身的性质,它不能很好地处理异常值。

奇怪的是,in the OpenCV documentation on solvePnP() 它指出 vector<Point3f>vector<Point2f> 可以分别作为对象点和图像点的参数传递。