是否在ARKit中公开了pnp求解器,或者如何使用EmguCV c#wrapper在Unity3D项目中使用opencv的SolvePnP函数

问题描述 投票:1回答: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项目中正确使用openCV的PnP解算器使用EmguCV C#包装器(要知道的坐标系,正确的函数参数提供类似的相机内部矩阵,如何解释输出以使相机姿势正确)?

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

使用SolvePnPRansac导致Unity-Editor自身崩溃,即使我把它放在try-catch块中(可能我的输入参数有意想不到的格式)。我使用solvePnP取得了更大的成功,但结果并不是我所期望的。文档指出输出向量rvec和tvec对应于将对象从模型坐标系带到摄像机坐标系的平移和旋转。所以如果我把相机放到(0,0,0)看-z方向,让对象在tvec上用euler旋转rvec,我希望渲染的对象类似于我用于像素坐标对应的图像。我误解了吗?

我的怀疑:openCV状态的坐标系,图像坐标y从上到下,而z和x保持向前 - 向右。我尝试在y轴上反转2D和3D坐标,但它不起作用

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

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

solvePnP with Unity3D

没有答案

Camera pose estimation from homography or with solvePnP() function

How can I estimate the camera pose with 3d-to-2d-point-correspondences (using opencv)

区别:我需要在unity3D c#项目中完成

obtaining 2d-3d point correspondences for pnp or posit

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

c# opencv unity3d emgucv opencv-solvepnp
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产生)

© www.soinside.com 2019 - 2024. All rights reserved.