OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

时间:2022-09-10 18:40:05

出处:http://oliver.zheng.blog.163.com/blog/static/1424115952013349234838/


(转载自"结冰的雪"百度空间)

目的:用OpenGL模拟针孔相机的视角。

针孔相机模型(Pinhole camera model):内参(intristric parameters)f(focal length)、cc(principle point)、kc(distroations)、alpha_c(skew coefficient);外参(extristric parameters)R(旋转)、t(平移)。详见http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html。相机可以用http://www.vision.caltech.edu/bouguetj/calib_doc/的方法标定(Calibrate)。

OpenGL 投影矩阵(projection matrix):推导过程详见http://www.songho.ca/opengl/gl_projectionmatrix.html,OpenGL的矩阵变换详见http://www.songho.ca/opengl/gl_transform.html。矩阵形式如下:

OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)
设置方法:

OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

注意:fc与cc单位必须一致,或者为毫米,或者为像素。zfar与znear单位必须一致,一般为mm,即相机能看到的范围。而fc/cc与znear/zfar的单位可以不一致。

P的逆矩阵如下:

OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

OpenGL 模型投影矩阵(modelview matrix):由于OpenGL默认视角位于原点,面向-z轴,而相机视角一般如下图所示,x轴向右,y轴向下,z轴向里,即物体在前方。所以要先将视角变化一下:gluLookAt(0, 0, 0, 0, 0, 1, 0, -1, 0)可以完成这个任务,它产生矩阵Mv。

OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model) OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

世界坐标变换到相机坐标需要一个矩阵Mc,由旋转和平移构成:

OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

所以最终的modelview matrix为:

OpenGL投影矩阵与相机模型(Set Projection Matrix for Pinhole Camera Model)

至此P、M全部设置完成。

关于镜头畸变(lens distortion):这个比较复杂,如果镜头的畸变比较小简单忽略掉就可以了。如果不能忽略可以参考以下内容:

Lens Correction and Distortion:http://paulbourke.net/miscellaneous/lenscorrection/