2012-07-24 21 views
1

我试图使用OpenCV的solvePnPRansac()来计算3D物体的已知2D投影。我的数值(固有摄像机参数,模型点(3D),图像点(2D))都是双值。正常的solvePnP()并不抱怨。solvePnPRansac如何与double值一起使用?

但是,当我尝试使用solvePnPRansac,它产生的错误信息:

断言失败< opoints.depth()== CV_32F>

如何使用这个功能双重价值? (与浮动工作不会给出预期的结果)

+0

这两个函数的文档都指定它们使用cv :: Point2f/3f。我不知道如何避免自己改变源代码。你真的需要那么多的精度数字吗?你使用Ransac的事实表明你的数据有一些噪音,这意味着双精度是过度的。 – Hammer 2012-07-24 21:56:38

+0

好点。为什么我想让Ransac版本工作的主要动机是正常的solvePnP()给出了具有double值的视觉上很好的结果,但是没有float值(视觉上=当我使用报告的旋转和平移来计算背投影时),但不知何故旋转矩阵似乎是“错误的”,因为它与使用POSIT算法时的结果非常不同。 – Niko 2012-07-25 11:08:16

+0

使用浮动体时,您测试了多少“错误”行为?当使用这样的算法时,我喜欢通过生成一组3d点来进行测试,应用已知的变换和投影来获得2d点,然后将这些点馈送到算法中,以查看它是否可以重新创建我的变换。这可以让你看到究竟有什么错误,并一次测试你的自由度1。这应该给你一个更好的想法是什么问题。我怀疑这个问题是使用单精度。 – Hammer 2012-07-25 16:53:20

回答

2

今天我已经测试了SolvePnPRAnsac,对于ITERATIVE和P3P的结果似乎是相同的,但是当我使用这些结果来呈现我的对象时,排序的图像是非常与当前帧不同。 在EPnP选项的情况下,平移向量与ITERATIVE和P3P结果非常相似,但旋转与其他两个选项非常不同。然而,我从Epnp得到的渲染图像效果很好,似乎P3P和ITERATIVE在实现算法时存在一些问题。

相关问题