如何创建透视投影矩阵,给定焦点和摄像头主体中心

时间:2014-02-27 09:23:02

标签: opengl opencv graphics matrix computer-vision

我设法使用OpenCV获取相机的内在和外在参数,因此我有fx,fy,cx和cy。而且我还有屏幕/图像的宽度和高度。

但是如何从这些参数创建OpenGL透视投影矩阵?

glFrustrum展示了如何创建投影矩阵,给定Z near,Z far以及图像宽度和高度。但是如何在此矩阵中包含焦点和摄像机中心?

enter image description here

5 个答案:

答案 0 :(得分:11)

您可以查看以下链接

Kyle Simek's explanation

My explanation

答案 1 :(得分:9)

以下是获取OpenGL投影矩阵的代码,该矩阵相当于具有相机矩阵K=[fx, s, cx; 0, fy, cy; 0, 0, 1]和图像大小[W, H]的计算机视觉相机:

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity();            // Reset The Projection Matrix
GLdouble perspMatrix[16]={2*fx/W,0,0,0,2*s/W,2*fy/H,0,0,2*(cx/W)-1,2*(cy/H)-1,(zmax+zmin)/(zmax-zmin),1,0,0,2*zmax*zmin/(zmin-zmax),0};
glMultMatrixd(perspMatrix);

注意:zminzmax代表近Z和远Z剪裁平面。该公式假定OpenGL世界坐标系的选择如下:

enter image description here

假设OpenGL摄像机位于原点,朝向正Z轴,向下矢量共线且朝向正Y轴。

答案 2 :(得分:3)

关于AldurDisciple答案,如果用倒z轴选择世界坐标系,则需要使用此公式

inverted z axe

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity();            // Reset The Projection Matrix
GLdouble perspMatrix[16]={2*fx/w,0,0,0,0,2*fy/h,0,0,2*(cx/w)-1,2*(cy/h)-1,-(far+near)/(far-near),-1,0,0,-2*far*near/(far-near),0};
glMultMatrixd(perspMatrix);

答案 3 :(得分:1)

Open GL使用平截头体操作,该平截头体与透视投影有关,深度有一些限制,称为近和远值。想象一下,金字塔侧面躺着 - 这是截头锥体。另一个类比是投影仪光束在其宽度和高度上延伸距离 - 这也是截头锥体。因此,右侧,左侧,下方和顶部是您的图像坐标,而近距离和远距离是您的深度限制,近距离是focal plane。 OpenGL会将Cx和Cy放在图像平面的中心,以便您可以跳过它们。指定平截头体的另一种更自然的方法是基于视角或视场(典型的50-60度);您调用的函数是glPerspective(),您仍然有近距离和远距离,但不是尺寸指定角度和纵横比。祝你好运。

答案 4 :(得分:-1)

您有cxcyfxfywidthheight
并且您的方程式中需要leftrighttopbottom。 您可以使用这种方式计算这些值。

left = cx * near / -fx
top = cy * near / fy
right = -(width - cx) * near / -fx
bottom = -(height - cy) * near / fy