OpenCV+C++⾯阵相机标定函数的使⽤
1. FindChessboardCorners
到标定板内⾓点位置(⾓点是指⿊⽩⾊相接的⽅块定点部分;内⾓点是不与标定板边缘接触的内部⾓点)
函数试图确定输⼊图像是否是棋盘模式,并确定⾓点的位置。如果所有⾓点都被检测到且它们都被以⼀定顺序排布,函数返回⾮零值,否则在函数不能发现所有⾓点或者记录它们地情况下,函数返回0。例如⼀个正常地棋盘图右8x8个⽅块和7x7个内⾓点,内⾓点是⿊⾊⽅块相互连通的位置。这个函数检测到的坐标只是⼀个⼤约的值,如果要精确地确定它们的位置,可以使⽤函数FindCornerSubPix。 函数形式:findChessboardCorners( // 如果到⾓点则返回true
InputArray image, // 输⼊的棋盘格图像(8UC1或8UC3)
Size patternSize, // 棋盘格内部⾓点的⾏、列数
OutputArray corners, // 输出的棋盘格⾓点
int flags = CALIB_CB_ADAPTIVE_THRESH
| CALIB_CB_NORMALIZE_IMAGE);
Image:输⼊的棋盘图,必须是8位的灰度或者彩⾊图像。聚丙烯吸收塔
pattern_size:棋盘图中每⾏和每列⾓点的个数。
Corners:检测到的⾓点
Flags:⽤于指定在检测棋盘格⾓点的过程中所应⽤的⼀种或多种过滤⽅法,可以使⽤下⾯的⼀种或多种,如果都是⽤则使⽤OR:
CV_CALIB_CB_ADAPTIVE_THRESH -使⽤⾃适应阈值(通过平均图像亮度计算得到)将图像转换为⿊⽩图,⽽不是⼀个固定的阈值。CV_CALIB_CB_NORMALIZE_IMAGE -在利⽤固定阈值或者⾃适应的阈值进⾏⼆值化之前,先使⽤cvNormalizeHist来均衡化图像亮度。CV_CALIB_CB_FILTER_QUADS -使⽤其他的准则(如轮廓⾯积,周长,⽅形形状)来去除在轮廓检测阶段检测到的错误⽅块。
2. find4QuadCornerSubpix
对初步提取到的⾓点进⼀步提取亚像素信息,⽤于提⾼标定精度,获取内⾓点的精确位置。
函数形式:find4QuadCornerSubpix(InputArray img, InputOutputArray corners, Size region_size);
img:输⼊的Mat矩阵,最好是8位灰度图像,检测效率更⾼;
corners:初始的⾓点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,⼀般⽤元素是Pointf2f/Point2d的向量来表⽰:vector<Point2f/Point2d> imagePointsBuf;
region_size:⾓点搜索窗⼝的尺⼨;
3. drawChessboardCorners
在棋盘标定图上绘制到的内⾓点(仅⽤于显⽰)
函数形式:drawChessboardCorners( InputOutputArray image, Size patternSize, InputArray corners, bool patternWasFound ); image:8位灰度或者彩⾊图像;
patternSize:每张标定棋盘上内⾓点的⾏列数;
corners:初始的⾓点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,⼀般⽤元素是Pointf2f/Point2d的向量来表⽰:vector<Point2f/Point2d> iamgePointsBuf;
patternWasFound:标志位,⽤来指⽰定义的棋盘内⾓点是否被完整的探测到,true表⽰别完整的探测到,函数会⽤直线依次连接所有的内⾓点,作为⼀个整体,false表⽰有未被探测到的内⾓点,这时候函数会以(红⾊)圆圈标记处检测到的内⾓点;
隧道式搪瓷烧结炉patternWasFound=ture时,依次连接各个内⾓点
patternWasFound=false时,以(红⾊)圆圈标记处⾓点位置
4. calibrateCamera
函数形式:calibrateCamera( InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints,
Size imageSize,
CV_OUT InputOutputArray cameraMatrix,
CV_OUT InputOutputArray distCoeffs,
OutputArrayOfArrays rvecs,
OutputArrayOfArrays tvecs,
int flags=0,
无压锅炉TermCriteria criteria = TermCriteria( TermCriteria::COUNT+TermCriteria::EPS, 30,DBL_EPSILON) );
objectPoints:为世界坐标系中的三维点。在使⽤时,应该输⼊⼀个三维坐标点的向量的向量,即vector<vector> object_points。需要依据棋盘上单个⿊⽩矩阵的⼤⼩,计算出(初始化)每⼀个内⾓点的世界坐标。
imagePoints:为每⼀个内⾓点对应的图像坐标点。和objectPoints⼀样,应该输⼊vector<vector> image_points_seq形式的变量;imageSize:为图像的像素尺⼨⼤⼩,在计算相机的内参和畸变矩阵时需要使⽤到该参数;
cameraMatrix:为相机的内参矩阵。输⼊⼀个Mat cameraMatrix即可,如Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0)); distCoeffs:为畸变矩阵。输⼊⼀个Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))即可;
rvecs:为旋转向量;应该输⼊⼀个Mat类型的vector,即vectorrvecs;
tvecs:为位移向量,和rvecs⼀样,应该为vector tvecs;
flags:为标定时所采⽤的算法。有如下⼏个参数:
参数效果
CV_CALIB_USE_INTRINSIC_GUESS 使⽤该参数时,在cameraMatrix矩阵中应该有fx,fy,u0,v0的估计值。否则的话,将初始化(u0,v0)图像的中⼼
点,使⽤最⼩⼆乘估算出fx,fy
CV_CALIB_FIX_PRINCIPAL_POINT 在进⾏优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中⼼或者某
个输⼊的值直升机救援
CV_CALIB_FIX_ASPECT_RATIO 固定fx/fy的⽐值,只将fy作为可变量,进⾏优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx
和fy将会被忽略。只有fx/fy的⽐值在计算中会被⽤到
CV_CALIB_ZERO_TANGENT_DIST设定切向畸变参数(p1,p2)为零
CV_CALIB_FIX_K1,
…,CV_CALIB_FIX_K6
对应的径向畸变在优化中保持不变。
CV_CALIB_RATIONAL_MODEL计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。
criteria:是最优迭代终⽌条件设定。
5. projectPoints
对标定结果进⾏评价的⽅法是通过得到的摄像机内外参数,对空间的三维点进⾏重新投影计算,得到空间三维点在图像上新的投影点的坐标,计算投影坐标和亚像素⾓点坐标之间的偏差,偏差越⼩,标定结果越好。
函数形式:projectPoints( InputArray _opoints,
InputArray _rvec,
InputArray _tvec,
InputArray _cameraMatrix,
InputArray _distCoeffs,激光测长仪
防水摄像头OutputArray _ipoints,
OutputArray _jacobian,
double aspectRatio )
_points:物体点的坐标,为3xN或者Nx3的矩阵,这⼉N是视图中的所有所有点的数⽬。
_rvec:旋转向量,1x3或者3x1。
_tvec:平移向量,1x3或者3x1。
_cameraMatrix:摄像机内参数矩阵A:
_distCoeffs:形变参数向量,4x1或者1x4,为[k1,k2,p1,p2]。如果是NULL,所有形变系数都设为0。
_ipoints:输出数组,存储图像点坐标。⼤⼩为2xN或者Nx2,这⼉N是视图中的所有点的数⽬。
_jacobian:可选参数,Nx10矩阵,从上到下分为4个部分。
参数说明
dpdrot关于旋转向量部分的图像上点的导数,Nx3矩阵。
dpdt关于平移向量部分的图像上点的导数,Nx3矩阵。
dpdf关于fx和fy的图像上点的导数,Nx2矩阵。
dpdc关于cx和cy的图像上点的导数,Nx2矩阵。aspectRatio可选参数,关于形变系数的图像上点的导数,Nx4矩阵。