相机标定(张正友标定算法)解读与实战一

本文详细介绍了针孔相机模型,从世界坐标系到像素坐标系的转换过程,包括刚体变换、相机坐标系、像平面坐标系和像素坐标系的概念及相互转换。同时,探讨了相机畸变,包括径向畸变和切向畸变的数学模型,以及如何进行校正。最后,阐述了畸变矫正过程中像素坐标到归一化平面坐标再到像素坐标的计算步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考论文:

https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr98-71.pdf

针孔相机模型

世界坐标系
相机坐标系
归一化平面坐标系
像平面坐标系
像素坐标系

关于相机模型的文章太多了,要搞清楚,首先要弄清楚这5个坐标系,以及他们之间的转换关系。我这里开始由世界坐标系一步一步推导到像素坐标系进行讲解。

  • 世界坐标系到相机坐标系

    实际上是两个三维坐标系之间的转换关系,属于刚体变换,也就是说只有旋转R和平移t变换。旋转矩阵R是正交矩阵的单位矩阵,并且R的转置等于R的逆。XcX_cXc相机坐标系的点,XwX_wXw世界坐标系的点。
    .
    Xc=[xcyczc],Xw=[xwywzw] X_c = \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right], X_w=\left[ \begin{matrix} x_w \\ y_w \\ z_w \end{matrix} \right]Xc=xcyczc,Xw=xwywzw

Xc=RXw+tRT=R−1 X_c = RX_w + t \\ R^T=R^{-1} Xc=RXw+tRT=R1
R表示旋转矩阵,t表示平移向量,如果把Xc,XwX_c, X_wXc,Xw写成齐次向量的形式,那么他们之间的变换关系就可以写成矩阵相乘的形式。

[xcyczc1]=[Rt0T1][xwywzw1] \left[ \begin{matrix} x_c \\ y_c \\ z_c \\ 1 \end{matrix} \right]=\left[ \begin{matrix} R & t \\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] xcyczc1=[R0Tt1]xwywzw1

相机坐标系和世界坐标系之间可以互相转换,其中最常用的就是如何确定相机中心在世界坐标系中的位置
Xw=R−1(Xc−t)=R−1Xc−R−1t=RTXc−RTt X_w = R^{-1} (X_c - t) \\ = R^{-1}X_c - R^{-1}t \\=R^TX_c-R^Tt Xw=R1(Xct)=R1XcR1t=RTXcRTt
由于相机在相机坐标系的坐标为原点 Xc=[000]Xc =\left[\begin{matrix} 0 & 0 & 0 \end{matrix} \right]Xc=[000]
所以相机在世界坐标系中的坐标为:
Xwc=−RTt X_w^c = -R^Tt Xwc=RTt

相机坐标系到像平面坐标系
在这里插入图片描述
根据三角形相似
x=fxczcy=fyczc x = f \frac{x_c}{z_c} \\ y = f \frac{y_c}{z_c} x=fzcxcy=fzcyc

写成矩阵的形式
[xy1]=[f000f0001][xc/zcyc/zc1]1zc[f000f0001][xcyczc] \left[ \begin{matrix} x \\ y \\ 1 \end{matrix} \right] =\left[ \begin{matrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c/z_c \\ y_c/z_c \\ 1 \end{matrix} \right] \\ \frac{1}{z_c} \left[ \begin{matrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right] xy1=f000f0001xc/zcyc/zc1zc1f000f0001xcyczc

这里fff表示焦距,单位是m,[xc/zcyc/zc1]T\left[ \begin{matrix} x_c/z_c & y_c/z_c & 1 \end{matrix} \right]^T[xc/zcyc/zc1]T归一化平面坐标
像平面坐标系到图像坐标系
由于图像坐标系是用像素表示的,像平面坐标系都是m为单位的,所以要进行转换,
焦距f转换为像素,dx,dyd_x,d_ydx,dy 分别表示x和y方向每个像素占多大。fx,fyfx, fyfx,fy 的单位是像素
fx=fdxfy=fdy f_x = \frac{f}{d_x} \\ f_y = \frac{f}{d_y}fx=dxffy=dyf
在这里插入图片描述

由于像平面的原点在中心,而像素坐标的原点在左上角,因而需要在x和y方向分别平移 cx,cyc_x, c_ycx,cy个像素

[uv1]=[1dx0cx01dycy001][xy1] \left[ \begin{matrix} u \\ v \\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{d_x}& 0 & c_x \\ 0 & \frac{1}{d_y} & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y\\ 1 \end{matrix} \right] uv1=dx1000dy10cxcy1xy1

相机坐标系->像平面坐标->像素坐标
[uv1]=[1dx0cx01dycy001][xy1]=1zc[1dx0cx01dycy001][f000f0001][xcyczc]=1zc[fx0cx0fycy001][xcyczc] \left[ \begin{matrix} u \\ v \\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{d_x}& 0 & c_x \\ 0 & \frac{1}{d_y} & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y\\ 1 \end{matrix} \right]\\=\frac{1}{z_c} \left[ \begin{matrix} \frac{1}{d_x}& 0 & c_x \\ 0 & \frac{1}{d_y} & c_y \\ 0 & 0 & 1 \end{matrix} \right]\left[ \begin{matrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right]\\=\frac{1}{z_c} \left[ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right] uv1=dx1000dy10cxcy1xy1=zc1dx1000dy10cxcy1f000f0001xcyczc=zc1fx000fy0cxcy1xcyczc
其中矩阵为相机内参矩阵,只和相机本身有关 fx,fyf_x, f_yfx,fy为相机焦距,一般情况向两者相等, cx,cyc_x, c_ycx,cy为中心偏移像素,一般情况下为图像的1/2。
K=[fx0cx0fycy001] K= \left[ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right] K=fx000fy0cxcy1

那么世界坐标系到像素坐标系就可以写成:
[uv1]=1zc[fx0cx0fycy001][Rt0T1][xwywzw1]=1zcK[R∣t][xwywzw1] \left[ \begin{matrix} u \\ v \\ 1 \end{matrix} \right] =\frac{1}{z_c} \left[ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} R & t \\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] \\=\frac{1}{z_c}K[R|t] \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] uv1=zc1fx000fy0cxcy1[R0Tt1]xwywzw1=zc1K[Rt]xwywzw1
其中[R∣t]为外参矩阵,表示世界坐标系到相机坐标系的转换矩阵,K为相机内参矩阵[R|t] 为外参矩阵,表示世界坐标系到相机坐标系的转换矩阵, K 为相机内参矩阵[Rt]K

P=K[R∣t] P = K[R|t] P=K[Rt]
P为投影矩阵,表示一个4x4的矩阵。
关于针孔相机模型就解释到这里。

相机畸变模型

相机畸变模型一般包括径向畸变和切向畸变

  • 径向畸变是由于透镜的形状导致的,有桶形畸变和枕形畸变。对应的数学模型:

xdist=x+x(k1r2+k2r4+k3r6)ydist=y+y(k1r2+k2r4+k3r6)r=x2+y2 x_{dist} = x+x(k_1r^2 + k_2r^4+k_3r^6) \\ y_{dist} = y+y(k_1r^2 + k_2r^4+k_3r^6) \\ r=x^2+y^2 xdist=x+x(k1r2+k2r4+k3r6)ydist=y+y(k1r2+k2r4+k3r6)r=x2+y2

  • 切向畸变是由于安装导致透镜和成像平面不严格平行。对应的数学模型:

xdist=x+2p1xy+p2(r2+2x2)ydist=y+2p2xy+p1(r2+2y2) x_{dist} = x + 2p_1xy+p_2(r^2+2x^2)\\y_{dist} = y + 2p_2xy+p_1(r^2+2y^2) xdist=x+2p1xy+p2(r2+2x2)ydist=y+2p2xy+p1(r2+2y2)

同时进行径向畸变和切向畸变矫正,联合在一起:
xdist=x+x(k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydist=y+y(k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2) x_{dist} = x+x(k_1r^2 + k_2r^4+k_3r^6) + 2p_1xy+p_2(r^2+2x^2)\\ y_{dist} = y+y(k_1r^2 + k_2r^4+k_3r^6) +2p_2xy+p_1(r^2+2y^2) xdist=x+x(k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydist=y+y(k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2)

x,y 的值对应的是归一化平面坐标系的值,因而在校正图像的时候需要先把像素坐标转换为归一化平面坐标,然后再校正,最后再把校正后的xdist,ydistx_{dist}, y_{dist}xdist,ydist计算到像素坐标。
u=fxxdist+cxv=fyydist+cy u = f_xx_{dist} + c_x \\ v = f_yy_{dist} + c_y u=fxxdist+cxv=fyydist+cy

畸变系数涉及k1,k2,k3,p1,p2k_1, k_2, k_3, p_1, p_2k1,k2,k3,p1,p2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值