之前做过摄像机标定的研究,不过现在忘了好多,昨天下午又捡起来,好好复习一下(主要是学习opencv一书内容)。

摄像机标定基本知识:

摄像机标定误差包括内参(4个)、畸变参数(径向和切向共5个)、外参(平移和旋转共6个)。

误差参数分析:摄像机模型采用针孔模型成像模型,由于中心轴安装问题,这就造成了精度误差,就是所谓的相机内参数误差,使用一个3X3的矩阵表示(A) [fx 0 cx; 0 fy cy; 0 0 1].,有四个未知参数;另由于针孔成像采光效率不高,使用了透镜,这就造成的畸变误差:

径向畸变:这是由于透镜先天条件原因(透镜形状),成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越厉害。这里有3个参数,k1,k2,k3其中k3是可选参数。

切向畸变:这是摄像机安装过程造成的,如当透镜不完全平行于图像平面的时候产生的。

旋转和平移主要针对外参数,旋转3个角度和平移3个方向6个参数。

棋盘就不介绍了。主要是提取角点,便于后面计算,opencv函数都有函数。书上p423有原理介绍,感兴趣的朋友可以参考书上内容。

opencv实现过程及主要函数介绍:

1.首先获得数据源(视频或图像),我读取的一段自己录的视频;

2.初始化单帧棋盘数据,如6X4,并对棋盘操作提取角点;

用到的函数说明: 

CVAPI(int) cvFindChessboardCorners( const void* image, CvSize pattern_size,
                                    CvPoint2D32f* corners,
                                    int* corner_count CV_DEFAULT(NULL),
                                    int flags CV_DEFAULT(CV_CALIB_CB_ADAPTIVE_THRESH+CV_CALIB_CB_NORMALIZE_IMAGE) );

这个函数式找到内角点位置:

  • image

  • 输入的棋盘图,必须是8位的灰度或者彩色图像。

  • pattern_size

  • 棋盘图中每行和每列角点的个数。

  • corners

  • 检测到的角点

  • corner_count

  • 输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。

  • flags

  • 各种操作标志,可以是0或者下面值的组合:

    • CV_CALIB_CB_ADAPTIVE_THRESH - 使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。

    • CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。

    • CV_CALIB_CB_FILTER_QUADS - 使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

void cvInitUndistortMap( const CvMat* intrinsic_matrix, const CvMat* distortion_coeffs, CvArr* mapx, CvArr* mapy );
这个函数计算畸变映射,其中intrinsic_matrix摄像机内参数矩阵(A) [fx 0 cx; 0 fy cy; 0 0 1].distortion_coeffs形变系数向量[k1, k2, p1, p2,k3],大小为5x1或者1x5。mapx为x坐标的对应矩阵。mapy为y坐标的对应矩阵。
CVAPI(void) cvUndistort2( const CvArr* src, CvArr* dst, const CvMat* camera_matrix, const CvMat* distortion_coeffs, const CvMat* new_camera_matrix CV_DEFAULT(0) );

函数说明:

    其中,src为输入图像,dst为输出图像.,camera_matrix摄像机内参数矩阵(A) [fx 0 cx; 0 fy cy; 0 0 1],distortion_coeffs形变系数向量[k1, k2, p1, p2,k3],大小为5x1或者1x5。

建议还是使用第一种算法,因为计算畸变映射是一个耗时的操作,当畸变映射不变的时候,使用第一种效率更高。

本人实验效果如下:

        摄像机标定--矫正畸变_计算机图形学
                                               

代码这里就不留了,opencv也有类似的源码