为了方便自己回忆,本文从定性的角度描述了摄像机是如何把真是世界的三维坐标变成图像中的二维坐标的。
光线从物体发射开始,透过透镜到达摄像机的成像平面,从而形成摄像机捕捉的图像。通过这一句话就可以简单描述摄像机捕捉图像的过程。如果你觉得这样的描述不够具体,可以参考小孔成像模型。
然而,由于真是的小孔无法为快速曝光收集足够的光线,所以摄像机引入了透镜来收集更多的光线。引入透镜的过程,由于加入了仪器和透镜本身的误差,使得原本简单的几何模型变得复杂,这就是所有摄像机收集的图像都需要标定和校正的原因。
要理解摄像机校正的过程,必须要理解以下几个坐标系的概念:
世界坐标系:根据需求而任意定义的真实世界的绝对坐标,用X,Y,Z定义。
摄像机坐标系:以摄像机中心为原点,以穿过中心点的光轴为Z轴而建立的三维坐标系。按我的理解,其实摄像机坐标系就是一个特殊的世界坐标系,只不过这个坐标系的原点位置和X,Y,Z轴的方向已经由摄像机的位置确定了。所以,世界坐标系里的坐标只要通过旋转和平移就能转化成摄像机坐标系。
图像坐标系:图像坐标系分为两种,他们的区别是原点的位置不同。一种是图像物理坐标系,另一种是图像像素坐标系。图像物理坐标系的原点是光轴与感光器件的成像平面的相交点,它的X,Y轴分别与摄像机坐标系的X,Y轴平行。图像像素坐标系的原点位于图像左上方,其u,v轴也是平行于摄像机坐标系的X,Y轴。
建立相机成像的数学模型,其实就是根据这三个不同(图像物理坐标系和图像像素坐标系本质是一样)把世界坐标系的坐标通过一定的变换变成图像坐标系里的坐标而已。
世界坐标系转换为摄像机坐标系的过程其实在上文的介绍中以及说明了,世界坐标系里的平移和旋转的长度和角度一共需要六个参数来确定(平移的x,y,z以及旋转时绕x,y,z三个轴的旋转角度),这六个参数称之为摄像机的外参数。
摄像机坐标系要转化为图像坐标则略微麻烦,接下来一步步说明:
按照针孔成像模型图像物理坐标系的原点和摄像机坐标系的原点应该是在同一条直线上的,参考《学习OpenCV》408页的图11-2,图像坐标系里点的位置应该是和摄像机的点在在两个相似三角形内,成比例关系,而且这个比例和摄像机的焦距有关:
X图=f*(X/Z),Y图=f*(Y/Z)
f是焦距,X,Y,Z则是摄像机坐标系中的坐标。
但是,以上假设是不成立的。因为要让图像物理坐标系的原点(我猜测一般就是规定成像的中心点)和摄像机坐标系的原点在同一条直线上对工艺的要求太高了,一般情况下,在x和y方向上,他们都存在cx和cy的偏移,修正之后公式变为:
X图=f*(X/Z)+cx,Y图=f*(Y/Z)+cy
注意,以上的是针对图像物理坐标系来说的,对于图像像素坐标系,则cx和cy就不同了。
这里的f,cx,cy与摄像机本身密切相关,称之为摄像机的内参数。(f其实在x轴和y轴上的取值是不同的,因为单个像素点在低价成像仪上是矩形而不是正方形)
那么,修正之后的公式就能实现摄像机坐标系到图像坐标系的转化了吗?答案是,还是不能。
因为透镜本身是不完美的,工艺本身也是不完美的。所以,通过透镜采集过来的图像都在一定程度上存在着畸变。比较明显的畸变有径向畸变和切向畸变。
径向畸变的原因是透镜的折射率并不是均匀的,对于某些透镜,光线在远离透镜中心的地方比靠近中心的地方更加弯曲。可以用以下式子来修正这个畸变(其实是一个泰勒展开式):
x=x(k1*r^2+k2*r^4+k3*r^6),其中r=(x^2+y^2)^1/2
切向畸变的原因是由于透镜不完全平行于图像平面而产生的,可以用以下式子修正这个畸变:
x=x+[2p1y+p2(r^2+2*x^2)]
这里的五个参数被称为畸变参数,是与透镜和摄像机个工艺相关的参数。
设dx=x(1+k1*r^2+k2*r^4+k3*r^6)+[2p1y+p2(r^2+2*x^2)],dy=y(1+k1*r^2+k2*r^4+k3*r^6)+[2p1x+p2(r^2+2*y^2)](这里的x和y是等于X/Z和Y/Z)
可以得到最终的变换公式:
X图=f*dx+cx,Y图=f*dy+cy