最近,我设法使我的增强现实应用程序启动并以接近预期的速度运行。但是,我遇到一个问题,即使值是正确的,但通过某些翻译仍然无法进行扩充!解决这个问题真是太好了,因为我已经很接近完成这项工作了。
该系统利用带有红外反射标记的外部跟踪系统(Polaris Spectra立体声光学跟踪器)来建立全局和引用帧。我有一个带有标记的LEGO结构,该标记是增强的目标,一个使用CAD创建的LEGO结构的3D模型(具有其实际对应物的确切规范),一个跟踪指针工具以及一个带有世界引用的相机附加到它的标记。使用3D Slicer(我正在开发的环境)的医学成像软件中的工具集将虚拟空间注册到了现实世界。以下两张照片只是为了明确说明我正在处理的系统(5月或可能与问题无关)。
因此,简要概述了每个标记/组件的功能(标记是带有四个银色球的黑色十字):
cv::solvePnP()
进行的外部校准,将相机注册到该标记。 cv::findChessboardCorners()
获取用于外部校准的数据。 到现在为止,我一直对着系统背后的数学大惊小怪,直到一切都准备就绪为止。当我将相机原点估计到引用原点的位置移动时,两者之间的平移矢量约为[0; 0; 0]。因此,所有注册似乎都能正常工作。但是,当我运行应用程序时,会得到以下结果:
如您所见,扩充中有一个奇怪的偏移量。我曾尝试删除图像上的失真校正(当前已使用
cv::undistort()
完成),但这只会使问题变得更糟。轮换都是正确的,而且正如我之前所说,翻译似乎都很好。我不知道该怎么办。当然,在执行渲染管道的过程中可能会出错,所以我主要是在这里发布此代码,以希望有人遇到过类似的问题。我已经使用基于网络摄像头的跟踪方法执行了该项目,即使我使用相同的渲染过程,也没有遇到这样的问题。我在这篇文章中故意有一点模棱两可,以免使读者对情况的细节感到困惑,因为我可以包括这么多不同的细节。如果需要更多信息,我可以提供。任何建议或见解将不胜感激。谢谢!
最佳答案
您可以执行以下一些测试来验证每个模块是否正常运行。
首先验证您的外部和内部校准:
undistort
函数不支持具有非零偏斜的相机矩阵;使用此类矩阵可能不会引发任何异常,但会导致错误的未失真。 然后验证渲染管道,例如通过在移动照相机时检查场景标记是否正确地重新投影到照相机图像中来进行操作。
除此之外,如果不直接与系统交互,就很难猜测出什么地方出了问题。如果我是您,并且在进行上述测试后仍然不知道问题出在哪里,我将尝试从头开始,并使用玩具示例验证每个中间步骤。
关于opencv - 带有外部跟踪的AR-对齐错误,值正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33025904/