1

(从我在 OpenCV 论坛上的问题交叉发布http://answers.opencv.org/question/100840/where-to-set-origin-of-model-for-solvepnp/

大家好,一个多月来,我一直在为这个问题而烦恼。我不得不承认我没有仔细研究solvePnP背后的数学(大多数人没有,这就是我们有开源库的原因),因为原因。

关于将模型原点放置在何处,我想就使用solvePnP 寻求一些实用建议。

背景:我正在使用 OpenCV 制作头部跟踪应用程序。跟踪屏幕上的对象(其中 4 个)并不是真正的问题。弄清楚 6DoF 是。

摄像头:手机摄像头。我还没有进行校准,但我认为只要对象将头部保持在视图的中心,这应该不是什么大问题。我确实注意到边缘明显的桶形失真。

当前结果:根据模型“放置”的位置,我可以从旋转或平移部分获得稳定的性能。此外,在奇怪的情况下,我会从不同的运行中得到疯狂的结果。可能是某个地方的奇点。

输入solvePnP的参数:图像点——来自跟踪器(原点在左下角)。模型点——来自 3D 模型(原点左下角,转换为 OpenCV 左上角原点)。相机矩阵——图像的 fx,fy 最大尺寸,图像中心的主点,无倾斜(如果我进行校准,可能会改变)。将 ITERATIVE 与 extrinsicGuess 一起使用(因为没有它会非常紧张)。

所以我想问的具体建议是:我应该在哪里设置模型的原点(在这种情况下是人头)以获得一致的 6DoF 值?理想情况下,我想让旋转值“锚定”在颈部内部(距前部大约几厘米深)。我尝试将头部模型点平移到颈部内部,但我注意到当模型的很大一部分在 -z 范围内时,z 平移值变得疯狂。此外,它变得无法正确解决 x 旋转(无论我向上还是向下看,它都会给我正值)。

我应该将模型放置在模型空间的特定八分圆吗?我应该避免将模型的任何部分放在 -z 范围内,还是应该期望 solvePnP 在这种情况下返回 -z 转换?

PS这个问题可能有多个单独的问题,如果你能解决它们也很好,但我最关心模型空间中的模型放置及其与solvePnP的交互

4

1 回答 1

0

原点的位置应该无关紧要。根据我的经验,对象点的相对位置非常重要。您选择的点组必须对对象的所有 6 个自由度敏感(即,如果您平移或旋转对象,这些点必须在图像中移动)。如果在任何自由度上都没有足够的灵敏度,求解器将非常不稳定且不稳定。旋转的原点无关紧要。如果有某种方法可以在不改变点的情况下移动头部,这是一个问题,求解器将不稳定。

此外,您需要注意同一组点何时有多个可能的求解位置。如果您为该位置提供了一个良好的初始猜测,它通常会为您找到正确的解决方案。有时,如果求解器没有开始接近正确的解决方案,它可以在不同的解决方案之间来回交替。

于 2016-09-14T07:06:47.397 回答