做相机标定对于刚入手的人来说有很多疑惑的点,我总结个人的入手的方法和需要弄明白的问题:
一、相机标定是干什么的,需要什么器材才能做?双目校正目标是什么,又需要什么设备?
二、相机(针孔)模型是什么样的?世界坐标系,相机坐标系,图像物理坐标系,图像像素坐标系,这四个坐标系到底是什么?从世界坐标系到图像坐标系到底是怎么转换的?
三、Opencv中用到的相机标定函数,对应的算法具体是谁的,什么算法?获得的各矩阵数据的含义指的是什么?
四、获得单个相机的内参矩阵和畸变系数后,怎么对相机进行畸变校正?
五、分别获得两个相机的内参矩阵和畸变系数,以及两相机之间的相对旋转平移矩阵后。怎样进行双目平行校正?校正的结果和流程应该是怎样的?
这些问题如果搞清楚了,那么相机的畸变和平行校正的方法你一定也就明白了。
对于上述问题,我目前的理解如下:
一、相机标定就是要通过一定的方法对特定图像(棋盘格角点检测)计算出这个相机本身的一些参数,包扩:内参矩阵A,外参矩阵[R|T]、畸变系数[k1,k2,k3,~,p1,p2,~]。内参矩阵各元素意义:一个像素的物理尺寸dx和dy,焦距f,图像物理坐标的扭曲因子gama,图像原点的纵横偏移量cx和cy。外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。畸变系数:包括相机的径向畸变系数k1,k2,k3,~和相机的切向畸变系数p1,p2,~。需要的器材:一个黑白棋盘格的标定板,一个相机拍摄的不同角度或距离的棋盘格图像至少三张以上。
双目校正就是通过一定的方法将两个摄像头拍摄同一个物体的图像进行处理,使得两幅图像最终达到下面的目标,同一个物体在两幅图像中的大小一样,且水平在一条直线上。需要的设备:双目摄像头(即两个同规格的摄像头水平放置左右摄像头),拍摄同一个物理的左右图像对,需要已知左右相机的内参矩阵、畸变系数、右相机相对于左相机的旋转矩阵R(通过一定的方法可将此矩阵分解成两个矩阵R1和R2,即左右相机各旋转一半达到水平)。
二、针孔相机的模型:三维世界中的物体,经过相机成像系统,变成二维图像过程如下所示。
世界坐标系:就是物体在真实世界中的坐标,比如黑白棋盘格的世界坐标系定在第一个棋盘格的顶点,Zw就是垂直于棋盘格的方向。可见世界坐标系是随着物体的大小和位置变化的,单位是长度单位。
相机坐标系:以光心为相机坐标系的原点,以平行于图像的x和y方向为Xc轴和Yc轴,Zc轴和光轴平行,Xc,Yc,Zc互相垂直,单位是长度单位。
图像物理坐标系:以主光轴和图像平面交点为坐标原点,x和y方向如图所示,单位是长度单位。
图像像素坐标系:以图像的顶点为坐标原点,u和v方向平行于x和y方向,单位是以像素计。
从世界坐标系到图像坐标系的转换过程如下:世界坐标系通过外参矩阵转换到相机坐标系,相机坐标系通过内参矩阵转换到图像像素坐标系(这一步是通过两步完成的,一,相机坐标系通过焦距对角矩阵和畸变系数转换到图像物理坐标系,二图像物理坐标系通过像素转换矩阵转换到像素坐标系中)。转换过程和公式如下(将在接下来的文章里详细说明):
三、opencv标定中用到的重要函数和算法以及获取矩阵的含义:
findChessboardCorners()用来发现棋盘格的角点位置,这里用的是haaris角点检测方法。cornerSubPix()角点位置精确到亚像素级。
stereoCalibrate()通过角点推算出两个相机的内参矩阵M1,M2和畸变系数D1,D2,当然外参矩阵随之也就计算出来了(在图像校正中还没有用到外参),这里用到的是张正友相机标定算法。
stereoRectify()根据内参矩阵和畸变系数计算右相机相对于左相机的旋转R和平移矩阵T,并将这个旋转和平移矩阵分解成左、右相机各旋转一半的旋转R1,R2和平移矩阵T1,T2,这里用到的是bouguet极线校正的方法。
initUndistortRectifyMap()和remap()对左右相机拍摄的图像进行校正(在今后的文章中将会详细介绍实现方法和步骤)。
四、获取了内参矩阵和畸变系数对图像进行畸变校正时,就是解决图像的畸变问题(径向畸变是因为透镜本身工艺的问题,切向畸变是由于安装问题带来的)。畸变校正的过程是这样的,将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴),通过畸变系数校正图像的相机坐标,校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标(用插值的方法,将在后面的文章中叙述)。
五、双目平行校正,是针对图像对应的相机坐标系进行的,那么极线校正的时候应该注意就是在四中叙述的畸变校正过程中,在转换到相机坐标系后,左右图像对应的相机坐标系分别通过旋转矩阵R1和R2进行平行极线校正。步骤如下:将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴),通过旋转矩阵R1和R2进行平行极线校正,然后通过畸变系数校正图像的相机坐标,校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标