高级上下文:
在 Unity3D AR 项目中,系统使用机器学习提供图像中的一组 2D 像素坐标与世界坐标中的同一组 3D 点之间的对应关系。 根据这两组之间的对应关系,我想估计导致该图像的相机姿势。
要实现的低水平目标:
我的研究结果表明我使用PnP-Ransac算法。透视n点是我遇到的这个问题的名称:从匹配的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 的堆栈溢出问题,但没有一个与 Unity3D 或 c# 相关
solvePnP with Unity3D
没有答案
通过单应性或使用solvePnP((函数估计相机姿态
如何使用 3D 到 2D 点对应来估计相机姿势(使用 opencv(
区别:我需要在 unity3D C# 项目中执行此操作
获得 PNP 或 posit 的 2D-3D 点对应关系
我明白了,我需要使用数学算法,这就是理论,但现在我如何使用我可以使用的库
ARKIT 是否公开了 PnP 求解器? 我还不知道
关于如何在 Unity 项目中使用 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}
});
编辑:到目前为止,上述内容仅在 Unity 编辑器中对我有用。 直到现在,使用 ARKit 在移动设备上部署仍然为我产生不正确的结果!
3(如何从结果中解释TVEC和RVEC:
使用罗德里格斯将rvec正确转换为旋转矩阵,简单地做Quaternion.Euler(rvec[0],rvec[1],rvec[2](是行不通的!
首先旋转对象,然后通过tvec平移它,最后另外应用摄像机的localToWorld矩阵以相对于摄像机放置对象(如果您希望对象具有固定位置并且要放置摄像机,只需反转rvec和tvec生成的矩阵(