OpenCV入门:Hough霍夫变换-圆形选择(HoughCircles)

本文介绍了一种基于霍夫变换的圆形检测方法,并通过OpenCV实现。该方法首先进行边缘检测,然后应用霍夫圆变换找到图像中的圆形,最后在原图上标记出检测到的圆心和圆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

霍夫变换:圆形选择

#include <iostream> 
#include <fstream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp> 
#include<opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp>
#include <math.h>
using namespace cv;
using namespace std;
 
int main()
{
	Mat src, gray;
	src = imread("C:/Users/defaultuser0.DESKTOP-RNJTL1M/Desktop/OpenCV_Distinguish/DistinguishImages/11.jpg");
	if (!src.data)
		return -1;

	cvtColor(src, gray, CV_BGR2GRAY);
	
	Mat contours;
	Canny(gray, contours, 125, 350);
	threshold(contours, contours, 128, 255, THRESH_BINARY);

	//高斯模糊平滑  
	//GaussianBlur(gray, gray, Size(9, 9), 2, 2);
	imshow("contours", contours);
	vector<Vec3f> circles;
	//霍夫变换  
	/*
		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为输入图像,要求是灰度图像
		circles为输出圆向量,每个向量包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆半径
		method为使用霍夫变换圆检测的算法,Opencv2.4.9只实现了2-1霍夫变换,它的参数是CV_HOUGH_GRADIENT
		dp为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推
		minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心
		param1、param2为阈值
		minRadius和maxRadius为所检测到的圆半径的最小值和最大值
	*/
	HoughCircles(contours, circles, CV_HOUGH_GRADIENT, 1, contours.rows / 5, 150, 70, 0, 0);

	//在原图中画出圆心和圆  
	for (size_t i = 0; i < circles.size(); i++)
	{
		//提取出圆心坐标  
		Point center(round(circles[i][0]), round(circles[i][1]));
		//提取出圆半径  
		int radius = round(circles[i][2]);
		//圆心  
		circle(src, center, 3, Scalar(0, 255, 0), -1, 4, 0);
		//圆  
		circle(src, center, radius, Scalar(0, 0, 255), 3, 4, 0);
	}

	namedWindow("Circle", CV_WINDOW_AUTOSIZE);
	imshow("Circle", src);

	waitKey(0);
	return 0;
}

效果图:


### OpenCV 中 `HoughCircles` 函数的使用教程 #### 函数定义 在OpenCV中,`HoughCircles`用于检测图像中的圆形物体。其完整的函数原型如下: ```cpp 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位数据类型[^3]。 - **circles**: 输出向量,通常是一个二维数组,其中每一行代表一个检测到的的信息 (x, y, radius)[^3]。 - **method**: 圆形检测的方法,在当前版本仅支持霍夫梯(`HOUGH_GRADIENT`) [^2]。 - **dp**: 控制累加器分辨率与输入图像的比例因子。当`dp`=1时,两者具有相同的空间分辨率;若设为更大值,则会使计算效率提高但精下降[^4]。 - **minDist**: 表示两个相邻心之间的最小距离。此参数有助于减少误检情况的发生。 - **param1**: 边缘响应强上限阈值,实际应用中作为Canny算子的一部分参与工作。较低数值可能导致过多噪声点被认为是边缘特征。 - **param2**: 累加平面内的投票门限值。较高的设定意味着更严格的筛选条件,只保留那些得票数超过该值的位置作为潜在心候选者。 - **minRadius** 和 **maxRadius**: 定义了待测目标可能存在的最小和最大半径范围。合理配置这两个参数可以帮助排除不符合预期尺寸的对象。 #### Python 实现案例 下面给出一段简单的Python代码来演示如何调用`cv2.HoughCircles()`: ```python import cv2 import numpy as np # 加载并转换成灰模式 img = cv2.imread('coins.jpg', 0) # 应用高斯模糊去除一些不必要的细节干扰 blurred_img = cv2.GaussianBlur(img,(9,9),2) # 执行霍夫变换寻找圆形轮廓 circles = cv2.HoughCircles(blurred_img,cv2.HOUGH_GRADIENT,1,minDist=20,param1=50,param2=30,minRadius=0,maxRadius=0) if circles is not None: # 将结果转化为整型坐标 circles = np.uint16(np.around(circles)) for i in circles[0,:]: # 绘制外接矩形框 cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2) cv2.imshow('Detected Circles', img) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值