OpenCV 投影点与 Unity 相机视图之间不匹配

vwv*_*wvw 6 opencv computer-vision unity-game-engine pose-estimation opencv-solvepnp

我们正在开发一个 AR 应用程序,其中需要将对象的 3D 模型叠加到对象的视频流上。Unity 场景包含 3D 模型,并且相机正在拍摄 3D 对象。相机姿势最初未知。

\n\n

\xe2\x96\xb6我们尝试过的

\n\n

我们没有找到一个好的解决方案来直接在 Unity 中估计相机位姿。因此,我们使用了OpenCV,它提供了广泛的计算机视觉函数库。特别是,我们找到Aruco 标签,然后将其匹配的 3D-2D 坐标传递给solvePnp.

\n\n

solvePnp返回与现实相符最多几厘米的相机位置。我们还验证了较低的重投影误差。

\n\n

Aruco 标签的重投影

\n\n

每个使用过的标签角都会被重新投影并在图像上显示为红点。如您所见,差异很小。

\n\n

这些结果看起来不错,应该足以满足我们的用例。\n因此,我们根据现实和 OpenCV 验证相机姿势。

\n\n

\xe2\x96\xb6问题

\n\n

然而,当将相机放置在 Unity 场景中的估计姿势时,3D 对象无法很好地对齐。

\n\n

标记和视频流的统一视图

\n\n

在此 Unity 屏幕截图中,您可以看到虚拟(Unity 对象)绿色标签的视图与视频源中的真实标签不匹配。

\n\n

\xe2\x96\xb6可能的根本原因

\n\n

我们确定了可以解释 Unity 和 OpenCV 之间不匹配的不同可能根本原因:

\n\n
    \n
  • 相机内在参数的差异:我们尝试了不同的参数组,但没有一个绝对成功。我们首先使用 OpenCV 校准相机并尝试反向移植参数到 Unity。我们还查看了制造商数据,但没有提供更好的结果。最后,我们手动测量了视场 (FoV),并将其与已知的相机传感器尺寸相结合。这些测试的结果没有太大差异。
  • \n
  • Unity 和 OpenCV 之间相机模型的差异:OpenCV 使用针孔相机模型,但我无法找到关于 Unity 模拟哪个模型的结论性答案。
  • \n
\n\n

\xe2\x96\xb6注释

\n\n

我们的相机具有很大的视野(115\xc2\xb0)。

\n\n

传递到 OpenCV 和 Unity 的图像都已经很好地不失真。

\n\n

我们浏览了大部分标记为 OpenCV 和 Unity 的 SO 问题。大多数 不同的坐标系和旋转约定。在我们的例子中,这似乎不是问题,因为相机显示在 3D Unity 场景中的预期位置。

\n\n

\xe2\x96\xb6问题

\n\n
    \n
  1. Unity和OpenCV使用的相机模型有什么根本区别吗?
  2. \n
  3. 您是否发现任何其他可能的原因可以解释 Unity 和 OpenCV 之间的投影差异?
  4. \n
  5. 你知道没有 OpenCV 的情况下有什么可靠的方法来估计相机位姿吗?
  6. \n
\n