我设法使用OpenCV获取相机的内在和外在参数,因此我有fx,fy,cx和cy。而且我还有屏幕/图像的宽度和高度。
但是如何从这些参数创建OpenGL透视投影矩阵?
glFrustrum展示了如何创建投影矩阵,给定Z near,Z far以及图像宽度和高度。但是如何在此矩阵中包含焦点和摄像机中心?
答案 0 :(得分:11)
答案 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);
注意:zmin
和zmax
代表近Z和远Z剪裁平面。该公式假定OpenGL世界坐标系的选择如下:
假设OpenGL摄像机位于原点,朝向正Z轴,向下矢量共线且朝向正Y轴。
答案 2 :(得分:3)
关于AldurDisciple答案,如果用倒z轴选择世界坐标系,则需要使用此公式
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)
您有cx
,cy
,fx
,fy
,width
,height
。
并且您的方程式中需要left
,right
,top
,bottom
。
您可以使用这种方式计算这些值。
left = cx * near / -fx
top = cy * near / fy
right = -(width - cx) * near / -fx
bottom = -(height - cy) * near / fy