(从我在 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的交互