Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用三维到二维点对应(使用opencv)估计摄影机姿势_Java_Opencv_Computer Vision_Camera Calibration_Pose Estimation - Fatal编程技术网

Java 如何使用三维到二维点对应(使用opencv)估计摄影机姿势

Java 如何使用三维到二维点对应(使用opencv)估计摄影机姿势,java,opencv,computer-vision,camera-calibration,pose-estimation,Java,Opencv,Computer Vision,Camera Calibration,Pose Estimation,你好,我的目标是开发用于飞机(模拟器)驾驶舱的头部跟踪功能,以提供AR支持民用飞行员在恶劣的视觉条件下着陆和飞行 我的方法是检测我知道3D坐标的特征点(在黑暗的模拟器LED中),然后计算估计的(头戴相机的)姿势[R | t](旋转与平移相关) 我确实存在的问题是,估计的姿势似乎总是错误的,并且我的3D点的投影(我也用于估计姿势)与2D图像点不重叠(或不可见) 我的问题是: 如何使用给定的一组二维到三维点对应关系来估计相机姿势。 为什么不起作用?我是如何尝试的,哪里可能是错误的来源? 要在实际环

你好,我的目标是开发用于飞机(模拟器)驾驶舱的头部跟踪功能,以提供AR支持民用飞行员在恶劣的视觉条件下着陆和飞行

我的方法是检测我知道3D坐标的特征点(在黑暗的模拟器LED中),然后计算估计的(头戴相机的)姿势[R | t](旋转与平移相关)

我确实存在的问题是,估计的姿势似乎总是错误的,并且我的3D点的投影(我也用于估计姿势)与2D图像点不重叠(或不可见)

我的问题是:

如何使用给定的一组二维到三维点对应关系来估计相机姿势。

为什么不起作用?我是如何尝试的,哪里可能是错误的来源?

要在实际环境中获得理论解,测量(3D和2D点以及相机矩阵)的精度必须有多高?

该方法在理论上是否适用于共面点(x、y轴发生变化)?

我使用的硬件是爱普生BT-200

在飞机上,我定义了一个固定的坐标,我希望通过我的程序实现相对平移和旋转。该程序检测(唯一)LED的图像坐标,并将其与相应的3D坐标相匹配。使用OpenCV示例android代码()获得的相机矩阵,我尝试使用solvePnP估计姿势

我的相机矩阵和失真略有变化。以下是我从程序中获得的一些值。我确保打印出的圆形图案的圆形距离与源代码中记录的相同(以米为单位)

下面是一些示例以及我如何创建它的OpenCV Mat

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.04569467373955304,
//          0.1402980385369059,
//          0,
//          0,
//          -0.2982135315849994
//  };

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.08245931646421553,
//          -0.9893762277047577,
//          0,
//          0,
//          3.23553287438898
//  };

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.07444480392067945,
//          -0.7817175834131075,
//          0,
//          0,
//          2.65433773093283
//  };
    protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
            /*This matrix should have 5 values*/
            0.08909941096327206,
            -0.9537960457721699,
            0,
            0,
            3.449728790843752
    };

    protected final double[][] CAMERA_MATRIX_VALUES = new double[][]{
            /*This matrix should have 3x3 values*/
//          {748.6595405553738, 0, 319.5},
//          {0, 748.6595405553738, 239.5},
//          {0, 0, 1}
//          {698.1744297982436, 0, 320},
//          {0, 698.1744297982436, 240},
//          {0, 0, 1}
//          {707.1226937511951, 0, 319.5},
//          {0, 707.1226937511951, 239.5},
//          {0, 0, 1}
            {702.1458656346429, 0, 319.5},
            {0, 702.1458656346429, 239.5},
            {0, 0, 1}
    };

    private void initDestortionMatrix(){
        distortionMatrix = new MatOfDouble();
        distortionMatrix.fromArray(DISTORTION_MATRIX_VALUES);
    }

    private void initCameraMatrix(){
        cameraMatrix = new Mat(new Size(3,3), CvType.CV_64F);
        for(int i=0;i<CAMERA_MATRIX_VALUES.length; i++){
            cameraMatrix.put(i, 0, CAMERA_MATRIX_VALUES[i]);
        }
    }
//受保护的最终双精度[]失真矩阵值=新双精度[]{
///*此矩阵应具有5个值*/
//          0.04569467373955304,
//          0.1402980385369059,
//          0,
//          0,
//          -0.2982135315849994
//  };
//受保护的最终双[]失真矩阵值=新双[]{
///*此矩阵应具有5个值*/
//          0.08245931646421553,
//          -0.9893762277047577,
//          0,
//          0,
//          3.23553287438898
//  };
//受保护的最终双[]失真矩阵值=新双[]{
///*此矩阵应具有5个值*/
//          0.07444480392067945,
//          -0.7817175834131075,
//          0,
//          0,
//          2.65433773093283
//  };
受保护的最终双[]失真矩阵值=新双[]{
/*该矩阵应具有5个值*/
0.08909941096327206,
-0.9537960457721699,
0,
0,
3.449728790843752
};
受保护的最终双精度[]摄像机矩阵值=新双精度[]{
/*该矩阵应具有3x3值*/
//          {748.6595405553738, 0, 319.5},
//          {0, 748.6595405553738, 239.5},
//          {0, 0, 1}
//          {698.1744297982436, 0, 320},
//          {0, 698.1744297982436, 240},
//          {0, 0, 1}
//          {707.1226937511951, 0, 319.5},
//          {0, 707.1226937511951, 239.5},
//          {0, 0, 1}
{702.1458656346429, 0, 319.5},
{0, 702.1458656346429, 239.5},
{0, 0, 1}
};
私有void initdestorionmatrix(){
畸变矩阵=新的MatOfDouble();
来自数组的畸变矩阵(畸变矩阵值);
}
私有void initCameraMatrix(){
cameraMatrix=新垫(新尺寸(3,3),CvType.CV_64F);

对于(int i=0;i在尝试实现头部跟踪系统的过程中,我学到的一件事是,你应该从简单的问题开始,而不是转移到更复杂的问题。你的问题很长,令人遗憾的是,我没有时间分析它,也没有时间在你的代码中搜索错误或逻辑错误,所以至少我会尝试给你一些提示nts和工作示例

是Opencv教程,用于查找对象的翻译和旋转。它是用Python编写的,如果它是我的旧C++项目中的一个问题部分。 我的项目使用solvePnP或solvePnPRansac函数执行相同的任务(您可以更改模式)。请注意,我的代码它是一些旧“游乐场”的一部分投影,所以即使在我执行的清理之后,它仍然非常混乱。运行它时,向相机显示打印的棋盘,按“p”开始位置和旋转估计,“m”改变模式(0-ransac,1-pnp,2-posit,似乎不起作用…)或“d”使用分解系数打开/关闭。
这两个项目都依赖于查找棋盘模式,但修改它们以使用其他对象应该很容易

摄像机校准-虽然我一直在研究我的头部跟踪系统,但我从来没有用同样的结果校准过摄像机两次…所以我决定使用我在github上找到的一些校准文件,它工作得很好-你可以找到更多关于这个文件的信息,并链接到这个文件

编辑: 试着从尽可能简单的解决方案开始,在某些情况下(甚至是简单的情况下)会产生好的结果。我认为一个好的开始点是用教程()中的打印棋盘替换测试环境中的一张纸试着用任何编程语言来做任何工作解决方案——考虑使用Python或C++版本的OpenCV——有很多教程比java版本要多,并且比较代码中的结果和某个工作的结果。de将使它更容易。当您有了一些工作解决方案时,尝试修改它以与您的测试环境配合使用。Th