关于相机投影矩阵中主点偏移c_x、c_y作用的技术疑问
相机矩阵中主点偏移(
c_x、c_y)的几何原理解释 嘿,我来帮你把这个困惑的几何问题彻底掰明白!
首先得理清两个坐标系的差异,这是理解c_x、c_y作用的核心:
1. 投影坐标系 vs 图像存储坐标系
- 投影坐标系:这是相机透视投影的「自然坐标系」,原点是主点(Principal Point)——也就是相机光轴与成像平面的交点。当3D空间点通过透视投影到成像平面时,最初计算出的坐标(比如
u' = f_x*(X/Z)、v' = f_y*(Y/Z))都是相对于这个主点的:主点右侧为u'正方向,主点下方为v'正方向。 - 图像存储坐标系:我们日常处理图像时用的坐标系,原点在图像的左上角,向右为x轴正方向,向下为y轴正方向。
2. 为什么要加c_x和c_y?
主点在图像存储坐标系中的位置就是(c_x, c_y)(比如一张1920×1080的图像,主点通常接近(960, 540))。我们需要把投影坐标系下的坐标转换到图像存储坐标系,本质就是一次坐标平移:
- 假设投影坐标系下某点相对于主点的水平偏移是
u',那它在图像坐标系中的x坐标就是「主点的x坐标c_x+ 水平偏移u'」,也就是u_image = c_x + u' - 同理,垂直方向就是
v_image = c_y + v'
结合OpenCV的相机矩阵公式来看:
相机矩阵是:
[ f_x 0 c_x ] [ 0 f_y c_y ] [ 0 0 1 ]
当它和3D点的齐次坐标[X, Y, Z]^T相乘后,得到:
[ f_x*X + c_x*Z ] [ f_y*Y + c_y*Z ] [ Z ]
除以Z(透视除法)后,就得到图像坐标系下的最终坐标:( f_x*(X/Z) + c_x , f_y*(Y/Z) + c_y )
举个直观的例子
假设主点在图像中的位置是(960, 540),某个3D点投影后相对于主点的水平偏移是+100像素(主点右侧100像素),垂直偏移是+50像素(主点下方50像素):
- 投影坐标系下的坐标是
(100, 50) - 转换到图像坐标系后就是
(960+100, 540+50) = (1060, 590),这完全符合我们对图像像素位置的认知。如果不加c_x、c_y,得到的(100,50)会指向图像左上角附近的位置,这显然和实际投影位置完全不符。
简单来说:c_x和c_y就是帮我们把投影的「自然原点」(主点),平移到图像存储的「原点」(左上角),让计算出的像素坐标和图像实际存储的位置对应起来。
内容的提问来源于stack exchange,提问作者Carpetfizz
相关产品推荐
相关产品推荐

