Opencv霍夫变换圆检测实战之检测硬币(C++)

HoughCircles 函数可以利用霍夫变换算法检测出灰度图中的圆。不需要源图像是二值的,只用将原图转化为灰度图即可。

void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0);

  • image,输入图像,即源图像,需要为 8 位的灰度单通道图像。
  • circles,调用 HoughCircles 函数后此参数存储了检测到的圆的输出矢量,每个矢量由包含了 3 个元素的浮点矢量(x,y,radius)表示。
  • method,使用的检测方法,目前 OpenCV 中就霍夫梯度法一种可以使用,标识符为 HOUGH_GRADIENT。
  • dp,累加面分辨率(大小) = 原始图像分辨率(大小) × 1/dp。默认 dp = 1 时,两者分辨率相同。
  • minDist,两个圆心之间的最小距离。若两圆心距离 < minDist,则认为是同一个圆。
  • param1,Canny 边缘检测的高阈值,低阈值被自动置为高阈值的一半,默认为 100。
  • param2,累加平面某点是否是圆心的判定阈值。它越大,能通过检测的圆就更接近完美的圆形,默认为 100。
  • minRadius,圆半径的最小值。默认为 0。
  • maxRadius,圆半径的最大值,默认为 0。

此函数可以很容易地检测出圆心,但是可能找不到合适地圆半径。我们可以通过 minRadius 和 maxRadius 两个参数指定最大和最小圆半径,来辅助圆检测的结果。或者可以直接忽略返回半径,让二者均为默认值,只用 HoughCircles 函数检测出圆心,用额外步骤进一步确定半径。

其代码如下图所示:

#include 
#include 
#include 

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	char input_win[] = "input image";
	Mat src = imread("C:/opencv/data/coins.jpg");
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	imshow(input_win, src);

	// convert to gray
	Mat grayImg;
	cvtColor(src, grayImg, CV_BGR2GRAY);
	vectorcircles;
	int hough_value = 80;
	HoughCircles(grayImg, circles, HOUGH_GRADIENT, 1, 10, 110, hough_value, 10, 100);
	Mat houghcircle = src.clone();
	for (int i = 0; i < circles.size(); i++) {
		circle(houghcircle, Point(circles[i][0], circles[i][1]), circles[i][2], Scalar(0, 0, 255), 2);
	}
	imwrite("houghcircle.jpg", houghcircle);
	imshow("houghcircle", houghcircle);
	waitKey(0);
	return 0;
}

原图:

Opencv霍夫变换圆检测实战之检测硬币(C++)_第1张图片

 通过霍夫变换检测圆之后的图片如下图所示:

Opencv霍夫变换圆检测实战之检测硬币(C++)_第2张图片

你可能感兴趣的:(Opencv,opencv,c++)