摄像机标定:改正畸变
副标题#e#
之前做过摄像机标定的研究,不外此刻忘了许多几何,昨天下午又捡起来,好好温习一下(主要是进修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
角点数目
#p#副标题#e#
win
搜索窗口的一半尺寸。假如win=(5,5)那么利用(5*2+1)×(5*2+1)=11×11巨细的搜索窗口
zero_zone
死区的一半尺寸,死区为差池搜索区的中央位置做求和运算的区域。它是用来制止自相关矩阵呈现的某些大概的奇异性。当值为(-1,-1)暗示没有死区。
criteria
求角点的迭代进程的终止条件。即角点位置简直定,要么迭代数大于某个设定值,可能是准确懂到达某个设定值。criteria可以是最大迭代数目,可能是设定的准确度,也可以是它们的组合。
3.摄像机标定求参数,我们今朝求内参和畸变参数举办图像校正;
用到的函数说明:
void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points, const CvMat*point_counts, CvSize image_size, CvMat* intrinsic_matrix, CvMat* distortion_coeffs, CvMat* rotation_vectors=NULL, CvMat* translation_vectors=NULL, int flags=0 );
标定函数,求摄像机内参和外参数:
object_points
定标点的世界坐标,为3xN可能Nx3的矩阵,这里N是所有视图中点的总数。
image_points
定标点的图像坐标,为2xN可能Nx2的矩阵,这里N是所有视图中点的总数。
point_counts
向量,指定差异视图里点的数目,1xM可能Mx1向量,M是视图数目。
image_size
图像巨细,只用在初始化内参数时。
intrinsic_matrix
输出内参矩阵(A),假如指定CV_CALIB_USE_INTRINSIC_GUESS和(或)CV_CALIB_FIX_ASPECT_RATION,fx、 fy、 cx和cy部门可能全部必需被初始化。
distortion_coeffs
输出巨细为4×1可能1×4的向量,内里为形变参数[k1, k2, p1, p2]。
rotation_vectors
输出巨细为3xM可能Mx3的矩阵,内里为旋转向量(旋转矩阵的紧凑暗示方法,详细参考函数cvRodrigues2)
translation_vectors
输出巨细为3xM或Mx3的矩阵,内里为平移向量。
flags
差异的符号,可以是0,可能下面值的组合:
#p#分页标题#e#
CV_CALIB_USE_INTRINSIC_GUESS – 内参数矩阵包括fx,fy,cx和cy的初始值。不然,(cx, cy)被初始化到图像中心(这儿用到图像巨细),焦距用最小平方差方法计较获得。留意,假如内部参数已知,没有须要利用这个函数,利用cvFindExtrinsicCameraParams2则可。
CV_CALIB_FIX_PRINCIPAL_POINT – 主点在全局优化进程中稳定,一直在中心位置可能在其他指定的位置(当CV_CALIB_USE_INTRINSIC_GUESS配置的时候)。
CV_CALIB_FIX_ASPECT_RATIO – 优化进程中认为fx和fy中只有一个独立变量,保持比例fx/fy稳定,fx/fy的值跟内参数矩阵初始化时的值一样。在这种环境下, (fx, fy)的实际初始值可能从输入内存矩阵中读取(当CV_CALIB_USE_INTRINSIC_GUESS被指按时),可能回收预计值(后者环境中fx和fy大概被配置为任意值,只有比值被利用)。
CV_CALIB_ZERO_TANGENT_DIST – 切向形变参数(p1, p2)被配置为0,其值在优化进程中保持为0。
4.改正,操作上步求得的参数对图像举办改正。
用到的函数说明,有两种要领举办改正,下面都先容一下:
a.利用cvInitUndistortMap()和cvRemap()来处理惩罚,前者用来计较畸变映射,后者把求得的映射应用到图像。
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],巨细为5×1可能1×5。mapx为x坐标的对应矩阵。mapy为y坐标的对应矩阵。
void cvRemap( const CvArr* src, CvArr* dst,const CvArr* mapx, const CvArr* mapy,int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalar fillval=cvScalarAll(0) );
对图像举办普通几许调动,求得改正图像:
src
输入图像.
dst
输出图像.
mapx
x坐标的映射 (32fC1 image).
mapy
y坐标的映射 (32fC1 image).
flags
插值要领和以下开关选项的组合:
CV_WARP_FILL_OUTLIERS – 填充界线外的像素. 假如输出图像的部门象素落在调动后的界线外,那么它们的值设定为 fillval。
函数cvInitUndistortMap预先计较非形变对应-正确图像的每个像素在形变图像里的坐标。这个对应可以通报给cvRemap函数(跟输入和输出图像一起)。
b.利用cvUndistort2()这个函数一次完成所有事项,不推荐。
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],巨细为5×1可能1×5。
发起照旧利用第一种算法,因为计较畸变映射是一个耗时的操纵,当畸变映射稳定的时候,利用第一种效率更高。
本人尝试结果如下:
代码这里就不留了,opencv也有雷同的源码,有需要的伴侣留下接洽方法可以发给你们,共勉!