1

高级上下文:

在 Unity3D AR 项目中,系统使用机器学习提供图像中的一组 2D 像素坐标与世界坐标中的同一组 3D 点之间的对应关系。根据这两组之间的对应关系,我想估计导致该图像的相机姿势。

要实现的低级目标:

我的研究结果建议我使用 PnP-Ransac 算法。Perspective-n-Points 是我遇到的这个问题的名称:从匹配的 2D-3D 点中找到相机姿势。PnP 问题定义:https ://en.wikipedia.org/wiki/Perspective-n-Point

我试过的

1)我试图在 ARKit 中找到一个 PnP 求解器,但我找不到它,所以我猜它没有暴露。2) 我尝试使用商店中的 EmguCV 资产,这应该允许我在我的 Unity 项目中使用 openCV。OpenCV solvePnP 文档:https ://docs.opencv.org/3.3.0/d9/d0c/group__calib3d.html#ga50620f0e26e02caa2e9adc07b5fbf24e

问题:

ARKit 框架中是否有 PnP 求解器,如果没有,我如何在 Unity 项目中使用 EmguCV C# 包装器正确使用 openCV 的 PnP 求解器(要注意坐标系,正确的函数参数以提供像相机内在矩阵,如何解释输出以使相机姿势正确)?

我在尝试回答问题时遇到的问题:

使用 SolvePnPRansac 会导致 Unity-Editor 自身崩溃,即使我将它放在 try-catch 块中(可能我的输入参数有意外的格式)。仅使用solvePnP,我取得了更大的成功,但结果不是我所期望的。该文档指出,输出向量 rvec 和 tvec 对应于将对象从模型坐标系带到相机坐标系的平移和旋转。因此,如果我将相机置于 (0,0,0) 并观察 -z 方向,使对象位于 tvec 且具有欧拉旋转 rvec,我希望渲染的对象与我用于像素坐标对应的图像相似. 我误会了吗?

我的怀疑:openCV 的坐标系表明图像坐标 y 从上到下,而 z 和 x 保持向前向右。我尝试在 y 轴上反转 2D 和 3D 坐标,但它没有用

编辑 [我在这里删除了我的代码,因为自从我提出问题让它工作以来我改变了很多]

(许多中的一些)相关帖子 我看了其他 41 个带有标签 opencv-solvePnP 的 stackoverflow 问题,但没有一个与 Unity3D 或 c# 相关

使用 Unity3D 解决即插即用

没有答案

通过单应性或solvePnP()函数估计相机位姿

如何估计具有 3d 到 2d 点对应的相机姿势(使用 opencv)

区别:我需要在 unity3D c# 项目中进行

获取 pnp 或 posit 的 2d-3d 点对应关系

我明白了,我需要使用数学算法,这就是理论,但现在我如何使用我可以使用的库

4

1 回答 1

1

ARKIT 是否公开了 PnP 求解器?我还是不知道

关于如何在统一项目中使用 openCV:这是我自己的答案:

1)坐标系:只需确保您的 2D 点具有正确的垂直坐标方向:取决于您如何获得这些 2D 点,可能没有任何改变。

2)使用什么内在矩阵:

var pixelsPerMeter = (((float)Screen.height / 2f)) / (Mathf.Tan(_mainCamera.fieldOfView * Mathf.Deg2Rad / 2f));
var fx = pixelsPerMeter;
var cx = Screen.width * 0.5f;
var fy = pixelsPerMeter;
var cy = Screen.height * 0.5f;
var cameraMatrix = new Emgu.CV.Matrix<float>(new float[3, 3] {
        {fx,0,cx},
        {0,fy,cy},
        {0,0,1}
        });

编辑:到目前为止,以上内容仅适用于我的统一编辑器。到现在为止,使用 ARKit 在移动设备上部署对我来说仍然会产生不正确的结果!

3)如何从结果中解释 tvec 和 rvec:

使用 Rodrigues 将 rvec 正确转换为旋转矩阵,只需执行 Quaternion.Euler(rvec[0], rvec[1], rvec[2]) 将不起作用!

首先旋转你的对象,然后通过 tvec 平移它,最后再应用你的相机的 localToWorld 矩阵来放置对象相对于相机(如果你希望对象有一个固定的位置并且要放置相机,只需反转矩阵由 rvec 和 tvec 产生)

于 2018-11-07T14:09:40.523 回答