参考: http://blog.sina.com.cn/s/blog_5e3213f30101g2t5.html
http://blog.csdn.net/li_007/article/details/5976261
http://blog.sina.com.cn/s/blog_b364631a0101iopy.html
http://blog.csdn.net/aptx704610875/article/details/48914043
http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=calibratecamera
http://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html?highlight=calibratecamera
http://blog.csdn.net/felix86/article/details/38401447
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example5.html
http://www.cnblogs.com/lwl2015/archive/2015/04/23/4451038.html
一、图像像素坐标系(u,v)转图像物理坐标系(x,y)
由于(u,v)只能表示像素位于数组中的列数与行数,并没有使用物理单位表示该像素在图像中位置,所以需要再建立以物理单位(mm)表示的图像坐标系,(u,v)表示以像素为单位的图像坐标系的坐标,(X,Y)表示以mm为单位的图像坐标系的坐标,在X、Y坐标系中,原点O1定义在摄像机光轴与图像平面的交点,该点一般位于图像中心,但是由于制造原因,很多情况下会有偏移。图像坐标系是一个二维平面,又称为像平面,实际上就是摄像头的CCD传感器的表面。每个CCD传感器都有一定的尺寸,也有一定的分辨率,这个就确定了毫米与像素点之间的转换关系。举个例子,CCD的尺寸是8mm X 6mm,帧画面的分辨率设置为640X480,那么毫米与像素点之间的转换关系就是80pixel/mm。”设CCD传感器每个像素点的物理大小为dx*dy,相应地,就有dx=dy=1/80。
二、图像物体坐标系(x,y)转相机坐标系(Xc,Yc,Zc)
三、相机坐标系(Xc、Yc,Zc)转世界坐标系(Xw,Yw,Zw)
由点Oc与Xc、Yc、Zc轴组成的直角坐标系称为摄像机坐标系,OOc为摄像机焦距。由Xw、Yw和Zw轴组成世界坐标系。摄像机坐标系与世界坐标系之间的关系可以用旋转矩阵R与平移向量t来描述。
在这个公式中,R为3*3矩阵,T为3*1,0为(0,0,0)
(1)图像像素坐标(u,v)转图像物理坐标(x,y)
(2)图像物理坐标(x,y)转相机坐标系(
Xc、Yc,Zc
)
(3)相机坐标系
(
Xc、Yc
)转世界坐标系(Xw,Yw,Zw)
其中,很容易可以知道
alph=f/dx, beta=f/dy,分别代表了以X轴与Y轴方向上的像素为单位表示的等效焦距。
gamma在较高精度的相机模型中引入,表示图像平面中以像素为单位的坐标轴倾斜程度的量度,gamma=alpha*tan(theta) theta是相机CCD阵列v轴的偏斜角度。
由针孔模型我们可以知道,如果一直摄像机的内外参数,就知道投影矩阵M,这时候对任何空间点就可以求出其对应图像坐标,但是如果已知空间某点的像点m位置(u,v)即使已经知道摄像机内外参数,Xw也不能唯一确定,因为在投影过程中消去了Zc的信息。
在上面的式子中M是3x4不可逆矩阵,当已知M与(u,v)时,由公式得到的三个方程中消去z,只可以得关于Xw,Yw与Zw的两个线性方程,这个方程组即为射线OP的方程,也就是说,投影点为m的所有点均在该射线上,所以,该空间是不能唯一确定的。
补充:
摄像头由于光学透镜的特性使得成像存在着径向畸变,可由三个参数k1,k2,k3确定;由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数p1,p2确定。
上图右侧等式中,k1,k2,k3,k4,k5,k6为径向畸变,p1,p2为切向畸变。在OpenCV中我们使用 张正友相机标定法通过10幅不同角度的棋盘图像来标定相机获得相机内参和畸变系数。
函数:
calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs,flag)
其中:
objectPoints: 一组世界坐标系中的3D
imagePoints: 超过10张图片的角点集合
imageSize: 每张图片的大小
cameraMatrix: 内参矩阵
distCoeffs: 畸变矩阵(默认获得5个即便参数k1,k2,p1,p2,k3,可修改)
rvecs: 外参:旋转向量
tvecs: 外参:平移向量
flag: 标定时的一些选项:
CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,u0,v0的估计值。否则的话,将初始化(u0,v0)图像的中心点,使用最小二乘估算出fx,fy。
CV_CALIB_FIX_PRINCIPAL_POINT:在进行优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中心或者某个输入的值。
CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只将fy作为可变量,进行优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx和fy将会被忽略。只有fx/fy的比值在计算中会被用到。
CV_CALIB_ZERO_TANGENT_DIST:设定切向畸变参数(p1,p2)为零。
CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6:对应的径向畸变在优化中保持不变。
CV_CALIB_RATIONAL_MODEL:计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。
举例说明:
单个摄像头的定标主要是计算出摄像头的内参(焦距f和成像原点cx,cy、五个畸变参数(一般只需要计算出k1,k2,p1,p2,对于鱼眼镜头等径向畸变特别大的才需要计算k3))以及外参(标定物的世界坐标)。 OpenCV 中使用的求解焦距和成像原点的算法是基于张正友的方法,而求解畸变参数是基于 Brown 的方法
利用OpenCV 的双目标定程序或者MATLAB 标定工具箱进行标定,得到摄像机的内外
参数矩阵。分别存放在extrinsics.yml, intrinsics.yml 中。内容如下:
注意:所有分辨率下的畸变(k1,k2,p1,p2)相同,但内参不同(fx,fy,u0,v0),不同分辨率下需要重新标定相机内参