【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解
2017-04-07 17:35
2301 查看
棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测。opencv中封装了一个专门用于棋盘格角点检测的函数即cv::findChessboardCorners(),同时,也提供了一个专门用于绘制棋盘格角点的函数cv::drawChessboardCorners()。下面将对这两个函数进行详细的介绍。
1、cv::findChessboardCorners()棋盘格角点检测
该函数的具体调用形式如下:
第一个参数是输入的棋盘格图像(可以是8位单通道或三通道图像)。
第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘格的行列数,如下图棋盘格的行列数分别为4、8,而内部角点的行列数分别是3、7,因此这里应该指定为cv::Size(3, 7))。
第三个参数是检测到的棋盘格角点,类型为std::vector<cv::Point2f>。
第四个参数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()的具体调用形式如下:
第一个参数是棋盘格图像(8UC3)。
第二个参数是棋盘格内部角点的行、列,和cv::findChessboardCorners()指定的相同。
第三个参数是检测到的棋盘格角点。
第四个参数是cv::findChessboardCorners()的返回值。
下面是棋盘格检测与绘制的测试代码
检测和绘制的结果如下:
2017.04.07
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 );
第一个参数是输入的棋盘格图像(可以是8位单通道或三通道图像)。
第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘格的行列数,如下图棋盘格的行列数分别为4、8,而内部角点的行列数分别是3、7,因此这里应该指定为cv::Size(3, 7))。
第三个参数是检测到的棋盘格角点,类型为std::vector<cv::Point2f>。
第四个参数flag,用于指定在检测棋盘格角点的过程中所应用的一种或多种过滤方法,可以使用下面的一种或多种,如果都是用则使用OR:
cv::CALIB_CB_ADAPTIVE_THRESH:cv::findChessboardCorners()默认的阈值化处理基于平均亮度,如果该标志指定,则使用自适应滤波(自适应滤波见
OpenCV3中的阈值化操作——cv::threshold()与cv::adaptiveThreshold()详解
)。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<cv::Point2f> 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
相关文章推荐
- Opencv摄像头标定(参数+校正),但cvFindChessboardCorners不太稳定,必须标版
- EmguCV 中检测棋盘格角点的方法 FindChessboardCorners
- apt-get安装的OpenCV库中cvFindChessboardCorners函数的问题
- 【OpenCV3】图像轮廓查找与绘制——cv::findContours()与cv::drawContours()详解
- 图像轮廓查找与绘制——cv::findContours()与cv::drawContours()详解
- FindChessboardCorners 找棋盘角
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- 【OpenCV3】文字绘制——cv::putText详解
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- findChessboardCorners函数学习笔记
- FindChessboardCorners()
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- OpenCV14(检测和绘制棋盘角点)
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- 【OpenCV】cvFindContours参数详解
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- opencv cvFindContours 查找轮廓 cvDrawCountours 用法及例子
- opencv之查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- 使用OpenCV中cvFindContour函数检测轮廓的心得