我必须做一个作业,在该作业中,我应该将与solvePnP()
一起使用的功能SOLVEPNP_EPNP
和与solvePnPRansac()
一起使用的SOLVEPNP_ITERATIVE
进行比较。目的是根据输入图像计算变形图像。
为此,我获得了RGB输入图像,与16位深度信息图像相同的图像,相机内在函数以及给定图像与所需的最终变形图像之间的特征匹配点列表(与另一角度。
到目前为止,这是我完成这项任务的方式:
solvePnP()
和solvePnPRansac()
与相应的算法一起使用,其中计算的3D对象点和结果图像的特征匹配点为输入。结果,我得到了两种方法的旋转和平移向量。projectPoints()
计算所有特征匹配点的平均重新投影误差,并将所得的投影点与所得图像的特征匹配点进行比较。 使用上述步骤,我使用Ransac方法获得以下输出:
这看起来很像我的参考解决方案,因此这在大多数情况下应该是正确的。
但是,使用solvePnP()
的{{1}}方法时,产生的旋转和平移矢量看起来像这样,根本没有意义:
================使用SOVLEPNP_EPNP结果的solvePnP:==============
旋转:[-4.3160208e + 08; -4.3160208e + 08; -4.3160208e + 08]
翻译:[-4.3160208e + 08; -4.3160208e + 08; -4.3160208e + 08]
分配表指出,特征匹配项列表包含一些未命中匹配项,因此基本上是异常值。据我所知,Ransac可以更好地处理离群值,但这是否可能是其他方法产生这种怪异结果的原因?我期待一些异常,但这是完全错误的,并且由于图像区域内没有任何点,因此生成的图像完全是黑色的。
也许有人可以指出我正确的方向。
答案 0 :(得分:0)
好的,我可以解决问题。我事先使用float
进行所有所有计算(3D对象点,匹配等),然后尝试将所有内容更改为double
-达到了目的。
扭曲的透视图仍然不可用,并且我得到了很高的重投影误差,但是这应该是由于算法本身的性质造成的,它不能很好地处理异常值。
与此有关的奇怪的是,in the OpenCV documentation on solvePnP()
指出vector<Point3f>
和vector<Point2f>
可以分别作为对象点和图像点的参数传递。