相机标定的目的:获取摄像机的内参、外参矩阵以及畸变系数。其中内参是指相机的内在参数,从世界坐标系到像素坐标系之间的关系;外参是指相机模型相对于标定板,即相机坐标系相对于世界坐标系的旋转矩阵和平移矩阵;对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。
相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。
世界坐标系:真实世界的三维坐标,原点一般选为标定板左上第一个内角点,Xw,Yw,Zw。
相机坐标系:以相机光学中心为原点,张正友规定光轴与z轴重合,Xc,Yc,Zc。
图像坐标系:以相机拍摄图像的平面所建立的坐标系,原点为相机光轴与平面的交点,x,y表示。
像素坐标系:图像在像素矩阵中的像素位置,原点在整幅图像的左上角,u,v表示。
世界坐标系、相机坐标系和图像坐标系的坐标单位为mm,像素坐标系为像素
R为3X3的矩阵,代表世界坐标系中xyz轴向相机坐标系对应坐标轴转化时的旋转向量,t为平移向量
图像平面原点与相机原点之间的距离为f(焦距)
同为二维平面,原点不同,单位不同,转化公式如下:
u0,v0代表图像坐标系的原点,dx,dy代表1像素多少毫米
张正友方法,设Z=0,因此转化为
findChessboardCorners(输入图像,内角点行列数,存储角点坐标,提取方式)
find4QuadCornerSubpix(输入图像,角点坐标(既是输入也是输出),角点搜索尺寸)
calibrateCamera(世界坐标系坐标,亚像素化的坐标,图像的尺寸)
函数ProjectPoints通过给定的内参数和外参数计算三维点投影到二维图像平面上的坐标。
ProjectPoints
这个函数用于计算无畸变和修正转换关系,为了重映射,将结果以映射的形式表达。无畸变的图像看起来就像原始的图像,就像这个图像是用内参为newCameraMatrix
的且无畸变的相机采集得到的。
在单目相机例子中,newCameraMatrix一般和cameraMatrix相等,或者可以用cv::getOptimalNewCameraMatrix来计算,获得一个更好的有尺度的控制结果。
在双目相机例子中,newCameraMatrix一般是用cv::stereoRectify计算而来的,设置为P1或P2。 此外,根据R,新的相机在坐标空间中的取向是不同的。例如,它帮助配准双目相机的两个相机方向,从而使得两个图像的极线是水平的,且y坐标相同(在双目相机的两个相机谁水平放置的情况下)。 该函数实际上为反向映射算法构建映射,供反向映射使用。也就是,对于在已经修正畸变的图像中的每个像素(u,v),该函数计算原来图像(从相机中获得的原始图像)中对应的坐标系。
函数输出得到map1和map2,然后使用remap()函数:
remap():
第一个参数:输入图像,即原图像,需要单通道8位或者浮点类型的图像
第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型
第三个参数:它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等
第四个参数:它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示 CV_16UC1,CV_32FC1类型的Y值
第五个参数:插值方式,有四种插值方式:
(1)INTER_NEAREST——最近邻插值
(2)INTER_LINEAR——双线性插值(默认)
(3)INTER_CUBIC——双三样条插值(默认)
(4)INTER_LANCZOS4——lanczos插值(默认)
第六个参数:边界模式,默认BORDER_CONSTANT
第七个参数:边界颜色,默认Scalar()黑色