AR与外部跟踪 - 对齐错误,值是正确的

Swa*_*oth 6 opencv transformation transform augmented-reality vtk

我最近成功地使我的增强现实应用程序启动并运行接近预期.但是,我遇到了一个问题,即使值是正确的,增量仍然是一些翻译!因为我这将是美妙的得到这个解决如此接近到有这件事.

该系统利用具有红外反射标记的外部跟踪系统(Polaris Spectra立体光学跟踪器)来建立全局和参考帧.我有一个带有标记的LEGO结构,它是增强的目标,使用CAD创建的LEGO结构的3D模型,具有其真实世界对应物的精确规格,跟踪指针工具和带有世界参考的相机标记附在它上面.使用3D Slicer中的工具集将虚拟空间注册到现实世界中,这是一个医学成像软件,这是我正在开发的环境.下面是几张照片,只是为了澄清我正在处理的系统(May或可能与该问题无关).

乐高结构,带有跟踪摄像头和世界参考标记

场景图像1,右上方有跟踪器,左侧是注册棋盘

因此,简要概述每个标记/组件的确切作用(标记是黑色十字架与四个银球):

  • 世界标记(右侧第1个图像)是所有其他标记变换的参考框架.它固定在LEGO模型上,因此可以对LEGO的虚拟等效物进行单次注册.
  • 相机标记(第1张图像,附在相机上)跟踪相机.通过使用执行的外部校准将相机注册到该标记cv::solvePnP().
  • 棋盘用于使用跟踪指针(未示出)获取用于外部校准的数据cv::findChessboardCorners().

到目前为止,我一直在粉碎我的脸,反对系统背后的数学,直到最终排成一行.当我在估计相机原点到参考原点的位置移动时,两者之间的平移向量约为[0; 0; 0].因此,所有注册似乎都能正常工作.但是,当我运行我的应用程序时,我得到以下结果:

偏移示例1

偏移示例2

如您所见,增强中存在奇怪的偏移.我已经尝试去除图像上的失真校正(目前已完成cv::undistort()),但这只会使问题变得更糟.旋转都是正确的,正如我之前所说,翻译似乎都很好.我不知道是什么导致了这一点.当然,在渲染管道的实现过程中会出现很多问题,所以我主要是在这里发布这个,希望有人遇到过类似的问题.我已经使用基于网络摄像头的跟踪方法执行了这个项目,即使我使用了相同的渲染过程也没有遇到过这样的问题.

在这篇文章中,我故意有点模棱两可,以避免因为情况的细节而使读者陷入困境,因为我可以包含许多不同的细节.如果需要更多信息,我可以提供.任何建议或见解都会受到大力赞赏.谢谢!

BCo*_*nic 1

您可以执行以下一些测试来验证每个模块是否正常工作。

首先验证您的外部和内部校准:

  • 检查虚拟场景标记相对于虚拟乐高场景的位置是否准确对应真实场景标记相对于真实乐高场景的位置(例如,自上次测量以来,真实场景标记可能已移动)位置)。
  • 相机标记也是如此,自从您上次校准其相对于相机光学中心的位置以来,它可能已经移动。
  • 检查相机的校准是否仍然准确。对于这样的相机,首选 [fx,0,cx;0,fy,cy;0,0,1] 形式的相机矩阵(即倾斜固定为零)并估计相机畸变系数(注意:OpenCV 的undistort函数不支持具有非零倾斜的相机矩阵;使用此类矩阵可能不会引发任何异常,但会导致错误的不失真)。
  • 检查标记跟踪器是否不需要重新校准。

然后验证渲染管道,例如,在移动相机时检查场景标记是否正确地重新投影到相机图像中。

  • 如果它没有正确地重新投影,则可能是您将 OpenCV 相机矩阵映射到 OpenGL 投影矩阵的方式有错误,或者您将 OpenCV 相机姿势映射到 OpenGL 模型视图矩阵的方式有错误。尝试使用具有简单 3D 点、简单投影和模型视图矩阵的玩具示例来确定哪一个是错误的。
  • 如果重新投影正确,则可能存在校准问题(见上文)。

除此之外,如果不直接与系统交互,很难猜测可能出现什么问题。如果我是你,并且在完成上述测试后我仍然不知道问题出在哪里,我会尝试从头开始并使用玩具示例验证每个中间步骤。