裁剪和缩放对相机内参的影响

对图像做裁剪或缩放后,如果还要使用它进行投影、反投影等几何计算,就需要同步更新相机内参。

采用 OpenCV 针孔相机模型的记号,内参矩阵为:

K=[fx0cx0fycy001]K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}

其中,fxf_x、fyf_y 是以像素为单位的焦距,(cx,cy)(c_x, c_y) 是主点坐标。以下均以图像左上角为坐标原点。

图像裁剪与相机内参示意图

裁剪:焦距不变,主点平移

裁剪不会改变像素的尺度,因此 fxf_x、fyf_y 保持不变;变化的是主点相对于新图像原点的位置。

假设裁剪区域的左上角位于原图的 (Δx,Δy)(\Delta x, \Delta y),那么:

cx′=cx−Δx,cy′=cy−Δyc_x' = c_x - \Delta x, \qquad c_y' = c_y - \Delta y

所以,只从右侧或底部裁剪时,图像原点不变,内参无需调整;从左侧或顶部裁剪时,则要减去相应的裁剪像素数。

缩放:焦距和主点一起缩放

设原图尺寸为 W×HW \times H,缩放后为 W′×H′W' \times H'。定义:

sx=W′W,sy=H′Hs_x = \frac{W'}{W}, \qquad s_y = \frac{H'}{H}

按 u′=sxuu' = s_x u、v′=syvv' = s_y v 的坐标变换,新的内参为:

K′=[sxfx0sxcx0syfysycy001]K' = \begin{bmatrix} s_x f_x & 0 & s_x c_x \\ 0 & s_y f_y & s_y c_y \\ 0 & 0 & 1 \end{bmatrix}

等比例缩放时,sx=sy=ss_x = s_y = s。例如,将宽高都缩小到原来的 1/α1/\alpha,四个参数都应除以 α\alpha。

先裁剪,再缩放

把两步合起来,就得到:

K′=[sxfx0sx(cx−Δx)0syfysy(cy−Δy)001]K' = \begin{bmatrix} s_x f_x & 0 & s_x(c_x - \Delta x) \\ 0 & s_y f_y & s_y(c_y - \Delta y) \\ 0 & 0 & 1 \end{bmatrix}

例如,先从左侧裁掉 100 像素,再将图像缩小到一半,新的横向主点坐标就是 (cx−100)/2(c_x - 100)/2。如果先缩放再裁剪,裁剪偏移量应按缩放后的像素坐标计算。

以上公式采用直接缩放像素坐标的约定。需要与具体图像库逐像素对齐时,还应核对其像素中心和插值采样约定。

本文采用 CC BY-NC-SA 4.0 协议