代码之家  ›  专栏  ›  技术社区  ›  Daveloper

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

  •  1
  • Daveloper  · 技术社区  · 8 年前

    高层背景:

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

    低层次目标:

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

    我试过的

    1) 我试图找到一个在阿基特PnP解算器,但我找不到它,所以我猜它没有暴露。 OpenCV solvePnP文档: https://docs.opencv.org/3.3.0/d9/d0c/group__calib3d.html#ga50620f0e26e02caa2e9adc07b5fbf24e

    问题是:

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

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

    使用SolvePnPRansac会导致Unity编辑器自崩溃,即使我将它放在try-catch块中(可能我的输入参数有意外的格式)。 我使用just solvePnP获得了更多的成功,但结果并不是我所期望的。 文件说明,输出向量rvec和tvec对应于将对象从模型坐标系带到相机坐标系的平移和旋转。因此,如果我把相机调到(0,0,0)向-z方向看,让物体在tvec,欧拉旋转rvec,我会期望渲染的物体与我用于像素坐标对应的图像相似。我误解了吗?

    我怀疑:

    (许多)相关的职位 我用tag opencv solvePnP查看了其他41个stackoverflow问题,但没有一个与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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Daveloper    7 年前

    ARKIT会暴露PnP解算器吗?我还是不知道

    关于如何在unity项目中使用openCV:以下是我自己的答案:

    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在移动设备上部署仍然会产生错误的结果!

    首先旋转对象,然后通过tvec对其进行平移,最后应用相机的localToWorld矩阵以相对于相机放置对象(如果希望对象具有固定位置并放置相机,只需反转由rvec和tvec生成的矩阵即可)

    推荐文章