视觉传感器:利用光学元件和成像装置获取外部环境图像信息的仪器。
通常视觉传感器,其主要功能是获取足够的机器视觉系统要处理的最原始图像,类似于人类的眼睛。
单目视觉的相机模组的组件包括了lens(镜头)、分色滤色片(IR cut)、感光元件等。 分色滤色片:对色光具有吸收、反射和透过作用的染有颜色的透明片。目前分色滤色片有两种分色方法:RGB原色分色法,CMYK补色分色法
感光元件,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。感光元件一般包括CCD和CMOS两种。像素值一般为(0-255),电路噪声导致像素值失真.
成像模型:相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程。
相机坐标系:O−x−y−zO−x−y−zO−x−y−z 为相机坐标系,在轴指向相机前方,xxx轴向右,yyy轴向下。OOO为摄像机的光心(或摄像头中心)。
物理成像平面: O’−x’−y’−z’O’−x’−y’−z’O’−x’−y’−z’为物理成像平面。物理成像平面到小孔的距离为fff,称之为焦距。
成像原理:空间点PPP的光束被映射到图像平面,图像平面感光之后形成像素P′P'P′。
接下来看看具体的原理推导:
首先,已知三维世界中的坐标点P=(X,Y,Z)P=(X,Y,Z)P=(X,Y,Z),成像平面中的P′=(X′,Y′)P'=(X',Y')P′=(X′,Y′),焦距为fff.由相似三角形原理可得,X′=−f⋅XZY′=−f⋅YZ\begin{array}{c}X' = - \frac{{f \cdot X}}{Z}\\\\Y' = - \frac{{f \cdot Y}}{Z}\end{array}X′=−Zf⋅XY′=−Zf⋅Y 在视觉感知中,常使用等效表达的方式来体现真实图像的输出过程 因此,我们可以将式子改为X′=f⋅XZY′=f⋅YZ\begin{array}{c}X' = \frac{{f \cdot X}}{Z}\\\\Y' = \frac{{f \cdot Y}}{Z}\end{array}X′=Zf⋅XY′=Zf⋅Y
从成像平面坐标到像素坐标:图像是基于像素来表达。像素坐标和成像平面坐标之间,相差了一个缩放和原点的平移。
假设正向成像平面中P’=(X’,Y’)P’=(X’, Y’)P’=(X’,Y’), 其像素坐标为(u,v)(u, v)(u,v).
缩放及平移的过程可以由下式来表达:{u=αX′+cxv=βY′+cy\left\{ {\begin{array}{ccccccccccccccc}{u = \alpha X' + {c_x}}\\{v = \beta Y' + {c_y}}\end{array}} \right.{u=αX′+cxv=βY′+cy 将P′P'P′的坐标代入,X′=f⋅XZ,Y′=f⋅YZ\begin{array}{c}X' = \frac{{f \cdot X}}{Z},Y' = \frac{{f \cdot Y}}{Z}\end{array}X′=Zf⋅X,Y′=Zf⋅Y,可以得到三维坐标与像素坐标的转换关系{u=fxXZ+cxv=fyYZ+cyfx=αf,fy=βf\begin{array}{l}\left\{ {\begin{array}{ccccccccccccccc}{u = {f_x}\frac{X}{Z} + {c_x}}\\{v = {f_y}\frac{Y}{Z} + {c_y}}\end{array}} \right.\\{f_x} = \alpha f,{f_y} = \beta f\end{array}{u=fxZX+cxv=fyZY+cyfx=αf,fy=βf 用矩阵的形式表达:[μν1]=1Z[fx0cx0fycy001][XYZ]\left[ {\begin{array}{ccccccccccccccc}\mu \\\nu \\1\end{array}} \right] = \frac{1}{Z}\left[ {\begin{array}{ccccccccccccccc}{{f_x}}&0&{{c_x}}\\0&{{f_y}}&{{c_y}}\\0&0&1\end{array}} \right]\left[ {\begin{array}{ccccccccccccccc}X\\Y\\Z\end{array}} \right]μν1=Z1fx000fy0cxcy1XYZ 其中,[μν1]\left[ {\begin{array}{ccccccccccccccc}\mu \\\nu \\1\end{array}} \right]μν1为像素坐标,[XYZ]\left[ {\begin{array}{ccccccccccccccc}X\\Y\\Z\end{array}} \right]XYZ为相机坐标系中的三维坐标点,[fx0cx0fycy001]\left[ {\begin{array}{ccccccccccccccc}{{f_x}}&0&{{c_x}}\\0&{{f_y}}&{{c_y}}\\0&0&1\end{array}} \right]fx000fy0cxcy1为内参矩阵。
相机的三维坐标系(OCO_COC) 并不是一个“稳定”的坐标系,会随着相机的移动而改变坐标的原点和各个坐标轴的方向。在应用中,相机安装在自动驾驶车辆上,随车辆运动相机坐标系实时变化。对一些需要固定特征坐标的应用,比如地图,因此需要引进一个稳定不变的坐标系:世界坐标系(OWO_WOW) 从某三维世界坐标系(OWO_WOW)到相机的三维坐标系(OCO_COC)的变换,称为相机的外参,本质是将世界坐标系中的特征点,转换到相机坐标系。
三维坐标系的变换是一个刚性平移加旋转的过程,变换包括平移向量(ttt:3x1)以及旋转矩阵(RRR:3x3)。
三维坐标变换表达:已知某世界坐标系(OWO_WOW)中空间点PW=(XW,YW,ZW)P_W =(X_W, Y_W, Z_W)PW=(XW,YW,ZW)以及OWO_WOW与相机坐标系(OCO_COC)的变换R,tR,tR,t. 求解此空间点在OC坐标系的坐标PC=(XC,YC,ZC)P_C =(X_C, Y_C, Z_C)PC=(XC,YC,ZC) 。
下式即为三维坐标变换:[XcYcZc]=[R11R12R13R21R22R23R31R32R33][XwYwZw]+[t1t2t3]\left[ {\begin{array}{ccccccccccccccc}{{X_c}}\\{{Y_c}}\\{{Z_c}}\end{array}} \right] = \left[ {\begin{array}{ccccccccccccccc}{{R_{11}}}&{{R_{12}}}&{{R_{13}}}\\{{R_{21}}}&{{R_{22}}}&{{R_{23}}}\\{{R_{31}}}&{{R_{32}}}&{{R_{33}}}\end{array}} \right]\left[ {\begin{array}{ccccccccccccccc}{{X_w}}\\{{Y_w}}\\{{Z_w}}\end{array}} \right] + \left[ {\begin{array}{ccccccccccccccc}{{t_1}}\\{{t_2}}\\{{t_3}}\end{array}} \right]XcYcZc=R11R21R31R12R22R32R13R23R33XwYwZw+t1t2t3
最后对整个过程进行总结:
世界坐标系(OWO_WOW)中空间点PW=(XW,YW,ZW)P_W =(X_W, Y_W, Z_W)PW=(XW,YW,ZW),成像到相机中得出其像点p=(u,v)p=(u,v)p=(u,v),需要经过三次变换:
首先对成像公式进行整理:
[μν1]=1ZC[fx0cx0fycy001][XCYCZC]=1ZC⋅K⋅[XCYCZC]=[μν1]=1ZC[fx0cx0fycy001][XCYCZC]=1ZC⋅K⋅(R⋅[XWYWZW]+t)=1ZC⋅K⋅([Rt01][XWYWZW1])=M⋅[XWYWZW1]=[M1M2M3M4M5M6M7M8M9M10M11M12]⋅[XWYWZW1]\begin{array}{c}\left[ {\begin{array}{ccccccccccccccc}\mu \\\nu \\1\end{array}} \right] = \frac{1}{{{Z_C}}}\left[ {\begin{array}{ccccccccccccccc}{{f_x}}&0&{{c_x}}\\0&{{f_y}}&{{c_y}}\\0&0&1\end{array}} \right]\left[ {\begin{array}{ccccccccccccccc}{{X_C}}\\{{Y_C}}\\{{Z_C}}\end{array}} \right]\\ = \frac{1}{{{Z_C}}} \cdot K \cdot \left[ {\begin{array}{ccccccccccccccc}{{X_C}}\\{{Y_C}}\\{{Z_C}}\end{array}} \right]\\ = \left[ {\begin{array}{ccccccccccccccc}\mu \\\nu \\1\end{array}} \right] = \frac{1}{{{Z_C}}}\left[ {\begin{array}{ccccccccccccccc}{{f_x}}&0&{{c_x}}\\0&{{f_y}}&{{c_y}}\\0&0&1\end{array}} \right]\left[ {\begin{array}{ccccccccccccccc}{{X_C}}\\{{Y_C}}\\{{Z_C}}\end{array}} \right]\\ = \frac{1}{{{Z_C}}} \cdot K \cdot \left( {R \cdot \left[ {\begin{array}{ccccccccccccccc}{{X_W}}\\{{Y_W}}\\{{Z_W}}\end{array}} \right] + t} \right)\\ = \frac{1}{{{Z_C}}} \cdot K \cdot \left( {\left[ {\begin{array}{ccccccccccccccc}R&t\\0&1\end{array}} \right]\left[ {\begin{array}{ccccccccccccccc}{{X_W}}\\{{Y_W}}\\{{Z_W}}\\1\end{array}} \right]} \right)\\ = M \cdot \left[ {\begin{array}{ccccccccccccccc}{{X_W}}\\{{Y_W}}\\{{Z_W}}\\1\end{array}} \right]\\ = \left[ \begin{array}{l}\begin{array}{ccccccccccccccc}{{M_1}}&{{M_2}}&{{M_3}}&{{M_4}}\end{array}\\\begin{array}{ccccccccccccccc}{{M_5}}&{{M_6}}&{{M_7}}&{{M_8}}\end{array}\\\begin{array}{ccccccccccccccc}{{M_9}}&{{M_{10}}}&{{M_{11}}}&{{M_{12}}}\end{array}\end{array} \right] \cdot \left[ {\begin{array}{ccccccccccccccc}{{X_W}}\\{{Y_W}}\\{{Z_W}}\\1\end{array}} \right]\end{array}μν1=ZC1fx000fy0cxcy1XCYCZC=ZC1⋅K⋅XCYCZC=μν1=ZC1fx000fy0cxcy1XCYCZC=ZC1⋅K⋅R⋅XWYWZW+t=ZC1⋅K⋅[R0t1]XWYWZW1=M⋅XWYWZW1=M1M2M3M4M5M6M7M8M9M10M11M12⋅XWYWZW1
标定的数学表达解释:输入nnn个特征点的世界坐标及像素坐标,输出MMM矩阵
原理:根据一对特征点Pi,piP_i , p_iPi,pi ,成像公式可以得到两个线性方程:
[μν1]=[M1M2M3M4M5M6M7M8M9M10M11M12]⋅[XiYiZi1]{\left[ {\begin{array}{ccccccccccccccc}\mu \\\nu \\1\end{array}} \right] = \left[ {\begin{array}{lllllllllllllll}{\begin{array}{ccccccccccccccc}{{M_1}}&{{M_2}}&{{M_3}}&{{M_4}}\end{array}}\\{\begin{array}{ccccccccccccccc}{{M_5}}&{{M_6}}&{{M_7}}&{{M_8}}\end{array}}\\{\begin{array}{ccccccccccccccc}{{M_9}}&{{M_{10}}}&{{M_{11}}}&{{M_{12}}}\end{array}}\end{array}} \right] \cdot \left[ {\begin{array}{ccccccccccccccc}{{X_i}}\\{{Y_i}}\\{{Z_i}}\\1\end{array}} \right]}μν1=M1M2M3M4M5M6M7M8M9M10M11M12⋅XiYiZi1
每一对特征点可以转换为两个线性方程,共11个自由度
所以,如果n>=6n>=6n>=6,即可计算得到MMM矩阵
实际应用中,一般会用非常多的特征点,基于最小二乘方法求解MMM矩阵。
如果镜头畸变需要矫正,则需要基于非线性方法,引入非线性畸变模型。一般可以采用非线性优化的方法求解。
由镜头透镜形状引起的畸变称为径向畸变,径向畸变主要分为桶形畸变和枕型畸变。
在针孔相机模型中,一条直线投影到像素平面上还是一条直线。 但在实际中,相机的透镜使得真实环境中的直线在图片中变成了曲线。由于透镜往往是中心对称的,这使得不规则畸变通常径向对称。径向畸变可由三个参数k1,k2,k3k_1,k_2,k_3k1,k2,k3确定。
xcorrected=x(1+k1r2+k2r4+k3r6)ycorrected=y(1+k1r2+k2r4+k3r6)\begin{array}{l}{x_{corrected}} = x(1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6})\\{y_{corrected}} = y(1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6})\end{array}xcorrected=x(1+k1r2+k2r4+k3r6)ycorrected=y(1+k1r2+k2r4+k3r6)
切向畸变源于透镜不完全平行于图像平面,即感光成像平面装配时与镜头间的角度不准;
产生的影响是图像像素点以畸变中心为中心点,沿着切向产生的位置偏差;
切向畸变由两个参数p1,p2p_1,p_2p1,p2确定。
xcorrected=x+[2p1xy+p2(r2+2x2)]ycorrected=y+[p1(r2+2y2)+2p2xy]\begin{array}{l}{x_{corrected}} = x + [2{p_1}xy + {p_2}({r^2} + 2{x^2})]\\{y_{corrected}} = y + [{p_1}({r^2} + 2{y^2}) + 2{p_2}xy]\end{array}xcorrected=x+[2p1xy+p2(r2+2x2)]ycorrected=y+[p1(r2+2y2)+2p2xy]
结合径向畸变的式子,即可得到畸变矫正的公式:xcorrected=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ycorrected=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy\begin{array}{l}{x_{corrected}} = x(1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}) + 2{p_1}xy + {p_2}({r^2} + 2{x^2})\\{y_{corrected}} = y(1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}) + {p_1}({r^2} + 2{y^2}) + 2{p_2}xy\end{array}xcorrected=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ycorrected=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy
对于单目相机的标定,我们主要需要对以下几个量进行标定:
一步法:
直接使用最优化方法求出相机内外参数
两步法:
此部分来源于北京理工大学慕课《无人驾驶车辆》
左右双目相机有以下特点:
• 光圈中心都在x轴上
• 光圈中心距离称为“基线
将其转化为俯视图,如下所示 双目相机有以下几何关系
双面相机两相机间的角度可能存在偏差,因此测距原理z=fbuL−uRz = \frac{{fb}}{{{u_L} - {u_R}}}z=uL−uRfb不再适用,需要进行重新标定。具体标定对象则是两相机之间的相对旋转矩阵与平移向量。
除此之外,两相机之间的相对距离也可能有安装误差,同样需要标定。把左右相机的图像在水平方向严格对齐,对原始图像进行消除畸变,再进行图像校正与图像裁剪,最后就能得到校正后的图像。
逆透视变换,英文为IPM (Inverse Perspective Mapping)
原理:根据图片坐标与世界坐标的关系,将图片像素uvuvuv对应到路面xyxyxy
难点:一般来说,图片没有距离尺度信息,一个像素点确定一条射线而不能确定是哪个点
解决办法:假设地面平坦且高度已知(z=0)(z=0)(z=0),就等于将世界坐标降维到二维,实现uvuvuv与xyxyxy的一一对应。
接下来进行公式推导:
记点AAA在图片中坐标(uA,vAu_A, v_AuA,vA),真实世界坐标(xA,yAx_A, y_AxA,yA),则有[wxAwyAw]=[p11p12p13p12p22p23p13p231][uAνA1]\left[ {\begin{array}{ccccccccccccccc}{w{x_A}}\\{w{y_A}}\\w\end{array}} \right] = \left[ {\begin{array}{ccccccccccccccc}{{p_{11}}}&{{p_{12}}}&{{p_{13}}}\\{{p_{12}}}&{{p_{22}}}&{{p_{23}}}\\{{p_{13}}}&{{p_{23}}}&1\end{array}} \right]\left[ {\begin{array}{ccccccccccccccc}{{u_A}}\\{{\nu _A}}\\1\end{array}} \right]wxAwyAw=p11p12p13p12p22p23p13p231uAνA1 用第三行消去www,得xA=p11uA+p12vA+p13p31uA+p32vA+1{x_A} = \frac{{{p_{11}}{u_A} + {p_{12}}{v_A} + {p_{13}}}}{{{p_{31}}{u_A} + {p_{32}}{v_A} + 1}}xA=p31uA+p32vA+1p11uA+p12vA+p13yA=p21uA+p22vA+p23p31uA+p32vA+1{y_A} = \frac{{{p_{21}}{u_A} + {p_{22}}{v_A} + {p_{23}}}}{{{p_{31}}{u_A} + {p_{32}}{v_A} + 1}}yA=p31uA+p32vA+1p21uA+p22vA+p23 矩阵方程形成以pijp_{ij}pij作为未知数的2个方程
对BCDBCDBCD重复上述操作,形成8个方程,就能求解出全部8个未知数
上一篇:AX7A200教程(4): DDR3的读写fifo仿真
下一篇:9、断点调试