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

该博客介绍了如何利用OpenCV库中的HoughCircles函数,通过霍夫变换算法从灰度图像中检测圆。文章详细解释了函数参数的作用,如输入图像、输出圆的向量、检测方法、分辨率、圆心距离等,并提供了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 <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

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);
	vector<Vec3f>circles;
	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;
}

原图:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

runner000001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值