使用SOLVEPNP_EPNP进行摄影机姿态估计是否对异常值敏感,可以纠正吗?

时间:2019-06-23 15:01:32

标签: c++ opencv pose-estimation

我必须做一个作业,在该作业中,我应该将与solvePnP()一起使用的功能SOLVEPNP_EPNP和与solvePnPRansac()一起使用的SOLVEPNP_ITERATIVE进行比较。目的是根据输入图像计算变形图像。

为此,我获得了RGB输入图像,与16位深度信息图像相同的图像,相机内在函数以及给定图像与所需的最终变形图像之间的特征匹配点列表(与另一角度。

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

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

这些是我的输入: enter image description here enter image description here

使用上述步骤,我使用Ransac方法获得以下输出: enter image description here 这看起来很像我的参考解决方案,因此这在大多数情况下应该是正确的。 但是,使用solvePnP()的{​​{1}}方法时,产生的旋转和平移矢量看起来像这样,根本没有意义:

  

================使用SOVLEPNP_EPNP结果的solvePnP:==============

     

旋转:[-4.3160208e + 08; -4.3160208e + 08; -4.3160208e + 08]

     

翻译:[-4.3160208e + 08; -4.3160208e + 08; -4.3160208e + 08]

分配表指出,特征匹配项列表包含一些未命中匹配项,因此基本上是异常值。据我所知,Ransac可以更好地处理离群值,但这是否可能是其他方法产生这种怪异结果的原因?我期待一些异常,但这是完全错误的,并且由于图像区域内没有任何点,因此生成的图像完全是黑色的。

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

1 个答案:

答案 0 :(得分:0)

好的,我可以解决问题。我事先使用float进行所有所有计算(3D对象点,匹配等),然后尝试将所有内容更改为double-达到了目的。

扭曲的透视图仍然不可用,并且我得到了很高的重投影误差,但是这应该是由于算法本身的性质造成的,它不能很好地处理异常值。

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