棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测。opencv中封装了一个专门用于棋盘格角点检测的函数即cv::findChessboardCorners(),同时,也提供了一个专门用于绘制棋盘格角点的函数cv::drawChessboardCorners()。下面将对这两个函数进行详细的介绍。
1、cv::findChessboardCorners()棋盘格角点检测
该函数的具体调用形式如下:
bool cv::findChessboardCorners( // 如果找到角点则返回true
cv::InputArray image, // 输入的棋盘格图像(8UC1或8UC3)
cv::Size patternSize, // 棋盘格内部角点的行、列数
cv::OutputArray corners, // 输出的棋盘格角点
int flags = cv::CALIB_CB_ADAPTIVE_THRESH
| cv::CALIB_CB_NORMALIZE_IMAGE
);
第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘格的行列数,如下图棋盘格的行列数分别为4、8,而内部角点的行列数分别是3、7,因此这里应该指定为cv::Size(3, 7))。
第三个参数是检测到的棋盘格角点,类型为std::vector
第四个参数flag,用于指定在检测棋盘格角点的过程中所应用的一种或多种过滤方法,可以使用下面的一种或多种,如果都是用则使用OR:
cv::CALIB_CB_ADAPTIVE_THRESH:cv::findChessboardCorners()默认的阈值化处理基于平均亮度,如果该标志指定,则使用自适应滤波(自适应滤波见
cv::CALIB_CB_NORMALIZE_IMAGE:阈值化前使用cv::equalizeHist()进行直方图均衡化处理。
cv::CALIB_CB_FILTER_QUADS:
cv::CALIB_CV_FAST_CHECK:
当然,找到的角点还需要使用cv::cornerSubPix()进行精度上的优化(具体请参考OpenCV3中的角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解)。
2、cv::drawChessboardCorners()棋盘格角点的绘制
cv::drawChessboardCorners()的具体调用形式如下:
void cv::drawChessboardCorners(
cv::InputOutputArray image, // 棋盘格图像(8UC3)即是输入也是输出
cv::Size patternSize, // 棋盘格内部角点的行、列数
cv::InputArray corners, // findChessboardCorners()输出的角点
bool patternWasFound // findChessboardCorners()的返回值
);
第一个参数是棋盘格图像(8UC3)。
第二个参数是棋盘格内部角点的行、列,和cv::findChessboardCorners()指定的相同。
第三个参数是检测到的棋盘格角点。
第四个参数是cv::findChessboardCorners()的返回值。
下面是棋盘格检测与绘制的测试代码
cv::Mat image_color = cv::imread("chessboard.png", cv::IMREAD_COLOR);
cv::Mat image_gray;
cv::cvtColor(image_color, image_gray, cv::COLOR_BGR2GRAY);
std::vector corners;
bool ret = cv::findChessboardCorners(image_gray,
cv::Size(3, 7),
corners,
cv::CALIB_CB_ADAPTIVE_THRESH |
cv::CALIB_CB_NORMALIZE_IMAGE);
//指定亚像素计算迭代标注
cv::TermCriteria criteria = cv::TermCriteria(
cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,
40,
0.1);
//亚像素检测
cv::cornerSubPix(image_gray, corners, cv::Size(5, 5), cv::Size(-1, -1), criteria);
//角点绘制
cv::drawChessboardCorners(image_color, cv::Size(3, 7), corners, ret);
cv::imshow("chessboard corners", image_color);
cv::waitKey(0);
return;
检测和绘制的结果如下:
2017.04.07