我们正在开发一个 AR 应用程序,在该应用程序中,我们需要在对象的视频流上叠加对象的 3D 模型。Unity 场景包含 3D 模型,并且摄像机正在拍摄 3D 对象。相机姿势最初是未知的。
▶我们尝试过的
我们没有找到直接在 Unity 中估计相机位姿的好方法。因此,我们使用了OpenCV,它提供了一个广泛的计算机视觉函数库。特别是,我们定位Aruco 标签,然后将它们匹配的 3D-2D 坐标传递给solvePnp
.
solvePnp
返回与现实一致的相机位置,最多几厘米。我们还验证了低的重投影误差。
每个使用过的标签角都被重新投影并在图像上显示为一个红点。如您所见,差异很小。
这些结果看起来不错,应该足以满足我们的用例。因此,我们根据现实和 OpenCV 验证相机姿势。
▶问题
然而,当将相机放置在 Unity 场景中的估计姿势时,3D 对象并没有很好地对齐。
在此 Unity 屏幕截图中,您可以看到虚拟(Unity 对象)绿色标签的视图与视频源中的真实标签不匹配。
▶可能的根本原因
我们确定了可以解释 Unity 和 OpenCV 之间不匹配的不同可能根本原因:
- 相机内在参数的差异:我们尝试了不同的参数集,但都没有绝对成功。我们首先使用 OpenCV 校准相机并尝试将参数反向移植到 Unity。我们还查看了制造商数据,但没有提供更好的结果。最后,我们手动测量了视野 (FoV) 并将其与已知的相机传感器尺寸相结合。这些测试之间的结果没有太大差异。
- Unity 和 OpenCV 之间相机模型的差异:OpenCV 适用于针孔相机模型,但我无法找到 Unity 模拟哪个模型的结论性答案。
▶备注
我们的相机具有大视野 (115°)。
传递给 OpenCV 和 Unity 的图像都没有失真。
我们经历了大多数标记为 OpenCV 和 Unity 的 SO 问题。大多数 人都关心不同的坐标系和旋转约定。在我们的案例中,这似乎不是问题,因为相机显示在 3D Unity 场景中的预期位置。
▶问题
- Unity 和 OpenCV 使用的相机模型有什么根本区别吗?
- 您是否看到任何其他可能的原因可以解释 Unity 和 OpenCV 之间的投影差异?
- 你知道在没有 OpenCV 的情况下估计相机姿势的任何可靠方法吗?