1.关键函数介绍
- 棋盘格角点检测函数 cv::findChessboardCorners()
bool findChessboardCorners(
InputArray image,
Size patternSize,
OutputArray corners,
int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE );
参数说明:
InputArray image :输入的棋盘图,必须是8位的灰度或者彩色图像,类型为Mat
Size patternSize :棋盘图中每行和每列角点的个数,类型为Size
OutputArray corners:检测到的角点存储的数组,类型为vector<Point2f>
int flags :用于指定在检测棋盘格角点的过程中所应用的一种或多种过滤方法,可以使用下面的一种或多种
CV_CALIB_CB_ADAPTIVE_THRESH 使用自适应阈值将灰度图像转化为二值图像,而不是固定的由图像的平均亮度计算出来的阈值
CV_CALIB_CB_NORMALIZE_IMAGE 在利用固定阈值或者自适应的阈值进行二值化之前,先使用equalizeHist来均衡化图像gamma值
CV_CALIB_CB_FILTER_QUADS 使用其他的准则(如轮廓面积,周长,类似方形的形状)来去除在轮廓检测阶段检测到的错误方块
说明:
函数cvFindChessboardCorners试图确定输入图像是否是棋盘模式,并确定角点的位置。如果所有角点都被检测到且它们都被以一定顺序排布,函数返回非零值,
否则在函数不能发现所有角点或者记录它们地情况下,函数返回0,这个函数检测到的角点坐标只是一个大约的值,找到的角点还需要使用cv::cornerSubPix()
进行精度上的优化
- 精确化角点位置函数 void cornerSubPix()
void cornerSubPix(
InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria );
参数说明:
InputArray image :输入的棋盘图
InputOutputArray corners:输入角点的初始坐标以及精准化后的坐标用于输出
Size winSize :搜索窗口边长的一半,例如如果winSize=Size(5,5),则一个大小为(5*2+1)*(5*2+1)=11*11的搜索窗口将被使用
Size zeroZone :搜索区域中间的dead region边长的一半,有时用于避免自相关矩阵的奇异性。如果值设为(-1,-1)则表示没有这个区域
TermCriteria criteria:角点精准化迭代过程的终止条件。也就是当迭代次数超过criteria.maxCount,或者角点位置变化小于criteria.epsilon时,
停止迭代过程
TermCriteria 类:迭代算法的终止准则
class CV_EXPORTS TermCriteria
{
public:
/**
Criteria type, can be one of: COUNT, EPS or COUNT + EPS
*/
enum Type
{
COUNT=1, //!< 最大迭代次数
MAX_ITER=COUNT, //!< 同上
EPS=2 //!< 迭代算法停止时所需的精度或参数的变化
};
//! default constructor
TermCriteria();
/**
@param type The type of termination criteria, one of TermCriteria::Type
@param maxCount The maximum number of iterations or elements to compute.
@param epsilon The desired accuracy or change in parameters at which the iterative algorithm stops.
*/
TermCriteria(int type, int maxCount, double epsilon);
int type; //!< the type of termination criteria: COUNT, EPS or COUNT + EPS
int maxCount; //!< the maximum number of iterations/elements
double epsilon; //!< the desired accuracy
}
- 棋盘图角点绘制函数 void drawChessboardCorners()
void drawChessboardCorners(
InputOutputArray image,
Size patternSize,
InputArray corners,
bool patternWasFound );
参数说明:
InputOutputArray image :输入及输出的棋盘格图像8UC3
Size patternSize :棋盘图中每行和每列角点的个数
InputArray corners :角点坐标
bool patternWasFound :findChessboardCorners()的返回值
- 求解相机内外参数函数calibrateCamera()
double calibrateCamera(
InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints,
Size imageSize,
InputOutputArray cameraMatrix,
InputOutputArray distCoeffs,
OutputArrayOfArrays rvecs,
OutputArrayOfArrays tvecs,
int flags=0,
TermCriteria criteria = TermCriteria( TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) );
参数说明:
InputArrayOfArrays objectPoints :世界坐标,类型为vector<vector<Vec3f>>,输入x,y,z=0
InputArrayOfArrays imagePoints :图像坐标,类型为vector<vector<Vec2f>>
Size imageSize :图像的size,用来初始化相机的内参数矩阵
InputOutputArray cameraMatrix :输出内参数矩阵
InputOutputArray distCoeffs :畸变系数,(k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]) of 4, 5, 8, 12 or 14 elements
OutputArrayOfArrays rvecs :旋转矩阵,类型为vector<Mat>
OutputArrayOfArrays tvecs :平移向量
int flags :默认为0也可以使以下几个值的组合
CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,将包含有效的fx,fy,cx,cy的估计值的内参矩阵,作为初始值输入,然后函数对其做进一
步优化。如果不使用这个参数,用图像的中心点初始化光轴点坐标(cx, cy),使用最小二乘法估算出fx,fy。注意,如果已知内部参数(内