本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:hough_circles

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src = imread("../sample/coins.jpg");
	if (src.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	GaussianBlur(gray, gray, Size(9, 9), 2, 2);
	imshow("gray", gray);
	vector<Vec3f> circles;
	double minDist = 30;
	double min_radius = 10;
	double max_radius = 40;
	HoughCircles(gray, circles, HOUGH_GRADIENT, 3, minDist, 100, 100, min_radius, max_radius);
	for (size_t t = 0; t < circles.size(); t++) {
		Point center(circles[t][0], circles[t][1]);
		int radius = round(circles[t][2]);
		// 显示
		circle(src, center, radius, Scalar(0, 0, 255), 2, 8, 0);
		drawMarker(src, center, Scalar(255, 0, 0), MARKER_TILTED_CROSS, 10, 2, 8);
	}
	imshow("hough circle demo", src);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

圆在平面坐标由三个参数决定:\(x_0,y_0,r\),代表圆心坐标和半径,参数方程描述为:

opencv4入门笔记(34):霍夫圆检测-萤火

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-bit单通道灰度图
  • circles:输出,vector,含有3或4个元素
    • x:圆形x坐标
    • y:圆形y坐标
    • radius:圆的半径
    • votes
  • method:检测方法
    • HOUGH_STANDARD:标准霍夫变换
    • HOUGH_PROBABILISTIC:基于概率的霍夫变换
    • HOUGH_MULTI_SCALE:HOUGH_STANDARD的多尺度变种
    • HOUGH_GRADIENT:霍夫梯度
  • dp:累加器分辨率与图像分辨率的反比。例如,如果 dp=1 ,则累加器具有与输入图像相同的分辨率。 如果 dp=2 ,累加器的宽度和高度是原来的一半。dp大,更容易找到圆
  • minDist:检测到的圆的中心之间的最小距离。如果参数太小,除了一个真一个之外,可能还会错误地检测到多个邻居圆。 如果太大,可能会遗漏一些圆圈。防止同心圆
  • param1:如果检测方法为HOUGH_GRADIENT,代表Canny边缘提取的高阈值(低阈值比它小两倍)
  • param2:如果检测方法为HOUGH_GRADIENT,代表检测圆心的累加器的阈值。越小检测的假圆越多
  • minRadius:最小半径
  • maxRadius:最大半径。如果 <= 0,则使用最大图像尺寸。 如果 < 0,则返回中心而不找到半径。