首页 / 软件开发 / C++ / 摄像机标定:矫正畸变
摄像机标定:矫正畸变2015-05-18之前做过摄像机标定的研究,不过现在忘了好多,昨天下午又捡起来,好好复习一下(主要是学习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 cvFindCornerSubPix(const CvArr* image,CvPoint2D32f* corners,int count,CvSize win,CvSize zero_zone,CvTermCriteria criteria)函数 cvFindCornerSubPix 通过迭代来发现具有子象素精度的角点位置:image输入的图像,必须是8位的灰度或者彩色图像。corners输入角点的初始坐标,也存储精确的输出坐标。count角点数目