摄像机标定:改正畸变
当前位置:以往代写 > C/C++ 教程 >摄像机标定:改正畸变
2019-06-13

摄像机标定:改正畸变

摄像机标定:改正畸变

副标题#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) );

对图像举办普通几许调动,求得改正图像:

#p#副标题#e#

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也有雷同的源码,有需要的伴侣留下接洽方法可以发给你们,共勉!

    关键字:

在线提交作业