【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解

棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测。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
	);

第一个参数是输入的棋盘格图像(可以是8位单通道或三通道图像)。

第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘格的行列数,如下图棋盘格的行列数分别为4、8,而内部角点的行列数分别是3、7,因此这里应该指定为cv::Size(3, 7))。

【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解_第1张图片


第三个参数是检测到的棋盘格角点,类型为std::vector

第四个参数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 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;


检测和绘制的结果如下:

【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解_第2张图片


2017.04.07

你可能感兴趣的:(图像处理,机器视觉,OpenCV)