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

sub*_*b_o 17 opengl graphics opencv matrix computer-vision

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

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

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

在此输入图像描述

kos*_*rge 11

您可以查看以下链接

Kyle Simek的解释

我的解释


BCo*_*nic 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);
Run Code Online (Sandbox Code Playgroud)

NB:zminzmax表示近Z和远Z剪裁平面.此公式假定OpenGL世界坐标框架选择如下:

在此输入图像描述

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


Luc*_*uca 5

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

倒置 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);
Run Code Online (Sandbox Code Playgroud)