最近,我设法使我的增强现实应用程序启动并以接近预期的速度运行。但是,我遇到一个问题,即使值是正确的,但通过某些翻译仍然无法进行扩充!解决这个问题真是太好了,因为我已经很接近完成这项工作了。

该系统利用带有红外反射标记的外部跟踪系统(Polaris Spectra立体声光学跟踪器)来建立全局和引用帧。我有一个带有标记的LEGO结构,该标记是增强的目标,一个使用CAD创建的LEGO结构的3D模型(具有其实际对应物的确切规范),一个跟踪指针工具以及一个带有世界引用的相机附加到它的标记。使用3D Slicer(我正在开发的环境)的医学成像软件中的工具集将虚拟空间注册到了现实世界。以下两张照片只是为了明确说明我正在处理的系统(5月或可能与问题无关)。

opencv - 带有外部跟踪的AR-对齐错误,值正确-LMLPHP

opencv - 带有外部跟踪的AR-对齐错误,值正确-LMLPHP

因此,简要概述了每个标记/组件的功能(标记是带有四个银色球的黑色十字):

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

  • 到现在为止,我一直对着系统背后的数学大惊小怪,直到一切都准备就绪为止。当我将相机原点估计到引用原点的位置移动时,两者之间的平移矢量约为[0; 0; 0]。因此,所有注册似乎都能正常工作。但是,当我运行应用程序时,会得到以下结果:

    opencv - 带有外部跟踪的AR-对齐错误,值正确-LMLPHP

    opencv - 带有外部跟踪的AR-对齐错误,值正确-LMLPHP

    如您所见,扩充中有一个奇怪的偏移量。我曾尝试删除图像上的失真校正(当前已使用cv::undistort()完成),但这只会使问题变得更糟。轮换都是正确的,而且正如我之前所说,翻译似乎都很好。我不知道该怎么办。当然,在执行渲染管道的过程中可能会出错,所以我主要是在这里发布此代码,以希望有人遇到过类似的问题。我已经使用基于网络摄像头的跟踪方法执行了该项目,即使我使用相同的渲染过程,也没有遇到这样的问题。

    我在这篇文章中故意有一点模棱两可,以免使读者对情况的细节感到困惑,因为我可以包括这么多不同的细节。如果需要更多信息,我可以提供。任何建议或见解将不胜感激。谢谢!

    最佳答案

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

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

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

  • 然后验证渲染管道,例如通过在移动照相机时检查场景标记是否正确地重新投影到照相机图像中来进行操作。
  • 如果无法正确地重新投影,则您将OpenCV相机矩阵映射到OpenGL投影矩阵或将OpenCV相机姿势映射到OpenGL模型 View 矩阵的方式可能存在错误。尝试使用具有简单3D点,简单投影和modelview矩阵的玩具示例来确定哪一个是错误的。
  • 如果重新投影正确,则可能存在校准问题(请参见上文)。

  • 除此之外,如果不直接与系统交互,就很难猜测出什么地方出了问题。如果我是您,并且在进行上述测试后仍然不知道问题出在哪里,我将尝试从头开始,并使用玩具示例验证每个中间步骤。

    关于opencv - 带有外部跟踪的AR-对齐错误,值正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33025904/

    10-09 06:02
    查看更多