我们正在开发一个AR应用程序,其中我们需要在一个对象的视频流上覆盖一个对象的3D模型。 Unity场景包含3D模型,并且照相机正在拍摄3D对象。相机的姿势最初未知。
▶我们尝试过的事情
我们没有找到直接在Unity中估算相机姿势的好方法。因此,我们使用了OpenCV,它提供了广泛的计算机视觉功能库。特别是,我们找到Aruco tags,然后将其匹配的3D-2D坐标传递到solvePnp
。
solvePnp
返回的相机位置与实际情况相符,可达几厘米。我们还验证了低重投影误差。
每个用过的标签角都会重新投影,并在图像上显示为红色点。如您所见,差异很小。
这些结果看起来不错,并且对于我们的用例来说应该足够了。 因此,我们根据真实性和OpenCV验证相机的姿势。
▶问题
但是,当将摄像机放置在Unity场景中的估计姿势时,3D对象的排列不太好。
在此Unity屏幕快照上,您可以看到虚拟(Unity对象)绿色标签的视图与视频供稿中的真实绿色标签不匹配。
▶可能的根本原因
我们确定了不同的可能根本原因,可以解释Unity和OpenCV之间的不匹配:
▶注释
我们的相机视野开阔(115°)。
传递给OpenCV和Unity的图像都已经很好地失真了。
我们经历了标记为OpenCV和Unity的大多数SO问题。 Most were与不同的坐标系和旋转约定有关。在我们的情况下,这似乎不是问题,因为相机显示在3D Unity场景中的预期位置。
▶问题