【CV】相机畸变
相机畸变
由于摄像机制造工艺偏差,以及入射光线在通过各个透镜时的折射误差和CCD点阵位置误差等,世纪的光学系统存在着非线性几何失真,从而使目标像点与理论像点之间存在着多种几何畸变。
其中影响最大的是径向畸变和切向畸变。径向畸变来自于透镜形状,切向畸变来自于整个摄像机的组装过程。
径向畸变主要有桶形畸变,枕形畸变和胡子畸变。主要原因是镜头形状的缺陷。
其中径向畸变成像仪中心畸变为0,随着向边缘移动,畸变越来越严重。可以通过下面的泰勒级数展开式进行校正:
Xc = x ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )
Yc = y ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )
r是该点距离成像中心的距离,r = x^2 + y^2,x,y是图像中畸变后的位置坐标,Xc,Yc是通过校正后得到的真实坐标,k1,k2,k3...是参数。
切向畸变主要有薄棱镜畸变和离心畸变。主要原因是由于透镜制造上的缺陷使得透镜本身与图像平面不平行。可以通过如下公式来矫正:
Xc = x + [ 2p1y + p2 ( r^2 + 2x^2 )]
Yc = y + [ 2p2x + p1 ( r^2 + 2y^2 )]
r是该点距离成像中心的距离,r = x^2 + y^2 ,x,y是图像中畸变后的位置坐标,Xc,Yc是通过校正后得到的真实坐标,p1,p2是参数。
opencv畸变模型
径向畸变模型:
Xc = x ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )
Yc = y ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )
切向畸变模型:
Xc = xd + [ 2p1xdyd + p2 ( r^2 + 2xd^2 )]
Yc = yd + [ 2p2xdyd + p1 ( r^2 + 2yd^2 )]
可得(一般情况下,薄棱镜畸变可以忽略不计,故opencv2.0版本只考虑了径向畸变和切向畸变):
Xc = xd ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 ) + [ 2p1xdyd + p2 ( r^2 + 2xd^2 )] ( 1 + p3r^2 + … )
Yc = yd ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 ) + [ 2p2xdyd + p1 ( r^2 + 2yd^2 )] ( 1 + p3r^2 + … )
p3为考虑切向畸变的扩展,此外设为0即可。
张正友标定中只有k1,k2,k3,p1,p2五个参数,对于质量比较好的相机切向畸变很小可忽略,k3也可忽略,张正友标定中默认p1,p2为0。