由于摄像头采用的结构及装配精度限制,摄像头不可能达到完美的成像效果。所以要通过获取一些有标准参数的图片的图像来计算出相机的一些内外参数,然后再根据这些参数对相机的成像进行校准。
所谓内参是指,摄像机内部的参数,包括:装配偏差(焦距和成像中心得偏移)和透镜畸变。在数学上,装配偏差可以用一个3x3的矩阵矩阵表示,通常也叫做“内参矩阵”,而透镜畸变则可以用一组向量表示。
所谓外参是指,摄像机相对外部坐标(又称世界坐标)的偏移和旋转,偏移包括x,y,z三个方向上的偏移,通常也可以用一组向量表示,旋转参数则可以用3x3的矩阵表示。
单目标定时,通常不关心外参,而双目标定时外参则是必要的。
那么如何得出以上参数呢?通常的方法就是用棋盘格法。
这种方法要求我们先用欲标定的摄像头对一块标准的棋盘图进行多角度采样,角度越多越好。通常要求在7张以上,若角度太少有可能因解不出参数而报错。
图片采集完成后我们即可进行单目标定过程。
OpenCV为我们提供了如下接口:
bool cv::findChessboardCorners( // 如果找到角点则返回true
cv::InputArray image, // 输入的棋盘格图像(8UC1或8UC3)
cv::Size patternSize, // 棋盘格内部角点的行、列数
cv::OutputArray corners, // 输出的棋盘格角点
int flags = cv::CALIB_CB_ADAPTIVE_THRESH
| cv::CALIB_CB_NORMALIZE_IMAGE
);
fisheye::calibrate()
通过这两个接口即可完成单目标定。
但在调用之前我们需要先获取这两者所要用到的参数。
未完待续。。。