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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
OpenCV摄像机标定矩阵与OpenGL投影矩阵的相关性_Opencv_Opengl_Rendering_Camera Calibration_Projection Matrix - Fatal编程技术网

OpenCV摄像机标定矩阵与OpenGL投影矩阵的相关性

OpenCV摄像机标定矩阵与OpenGL投影矩阵的相关性,opencv,opengl,rendering,camera-calibration,projection-matrix,Opencv,Opengl,Rendering,Camera Calibration,Projection Matrix,我很难用真实对象图片中显示的相同尺寸和比例来渲染.stl模型。 我把真实对象放在视图区域的中心,我想在模型和真实对象之间翻转(真实对象比模型中的小9倍) 首先,我使用OpenGL校准相机,就像在中一样,当焦距最适合真实对象时。 在获得cx、cy、fx和fy值后,我用这些值创建一个透视矩阵,并使用glMultMatrixd函数。 最后,我将照片调整为与OpenGL窗口相同的大小,并将照片与渲染模型进行比较 但我对结果有一些问题: 存在比例失真(宽于高) 存在透视失真(相机与对象垂直,因此我应该只查

我很难用真实对象图片中显示的相同尺寸和比例来渲染.stl模型。 我把真实对象放在视图区域的中心,我想在模型和真实对象之间翻转(真实对象比模型中的小9倍)

首先,我使用OpenGL校准相机,就像在中一样,当焦距最适合真实对象时。 在获得cx、cy、fx和fy值后,我用这些值创建一个透视矩阵,并使用glMultMatrixd函数。 最后,我将照片调整为与OpenGL窗口相同的大小,并将照片与渲染模型进行比较

但我对结果有一些问题:

  • 存在比例失真(宽于高)
  • 存在透视失真(相机与对象垂直,因此我应该只查看对象的顶部,但它显示对象的侧面)
  • 大小与真实对象不兼容(稍小)
  • 我的关系矩阵如下:

    GLdouble perspMatrix[16] = { fx / cx,     0   ,   0    ,    0,
        0,   fy / cy ,   0    ,    0,
        0,     0   ,  -(znear + zfar) / (znear - zfar), 2 * zfar*znear / (zfar - znear),
        0,     0   ,  -1    ,   0 };
    

    OpenGL希望矩阵按列主内存顺序排列。上面显示的数据结构是按行主内存顺序(正常的写入顺序,OpenCV也将其用作内存顺序)排列的,因此在传递到OpenGL之前需要对其进行转置

    您还构建了一个对称的视锥体(right==left==cx和top==bottom==cy),它假设光轴(cx,cy)位于相机成像器的中心。真正的相机从来没有这么完美,这就是为什么我们必须校准它们。您需要一个不对称的平截头体,使用left==cx、right==(width-cx)等;应该有帮助

    请注意,在OpenGL中,+Y向上,+Z在相机后面(在OpenCV中,+Y向下,+Z在相机前面),因此请检查矩阵上的符号