OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform),它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间,来确定哪些像素符合圆形状。

1. 霍夫变换的原理

霍夫变换的基本思想是将图像空间中的点映射到一个参数空间,在这个参数空间中可以检测特定的几何形状(如直线、圆等)。对于圆形,霍夫变换的目标是找到符合圆方程的像素。

圆的方程

在二维平面上,圆可以由以下方程描述:

(x-a)^2+(y-b)^2=r^2

其中:

  • (a, b) 是圆心坐标;
  • r 是圆的半径;
  • (x, y) 是圆周上的一个点。

2. 霍夫圆检测的步骤

2.1 边缘检测
  • 在进行霍夫变换之前,首先对图像执行边缘检测,通常使用 Canny 边缘检测器。边缘检测的目的是找到图像中的边缘像素,因为这些像素更有可能属于圆周。
2.2 参数空间的投票
  • 每一个在边缘图像中的像素点 (x, y),它可能属于多个不同圆的边界,因此需要通过以下步骤将其投票映射到参数空间:

    • 将每个边缘像素映射为一组可能的圆心 (a, b),这些圆心位于距离该像素 r 的位置。通过改变半径 r ,该像素 (x, y) 将投票给不同半径下的多个圆心。
    • 对于每个可能的半径 r ,根据圆方程:

a=x-rcos\theta\\ b=y-rsin\theta

                其中 θ 是不同的角度值(从 0 到 360 度),遍历这些角度得到可能的圆心 (a, b)。

  • 每个像素点对不同半径 r 和不同圆心 (a, b) 进行投票,记录这些投票结果。

2.3 累加器
  • 在参数空间 (a, b, r) 中有一个累加器,用来统计哪些 (a, b, r) 的组合收到了最多的投票。最多投票的点表示在边缘图像中最可能的圆心和半径。
  • 累加器的最大值对应的是检测到的圆。
2.4 圆的确定
  • 最后,累加器中投票结果最多的那些 (a, b, r) 组合将被认为是图像中检测到的圆形。霍夫圆检测可以输出这些圆的圆心坐标 (a, b) 以及半径 r。

3. OpenCV 中霍夫圆检测的实现

OpenCV 中使用 HoughCircles() 函数来进行霍夫圆检测,其主要参数包括:

  • image:输入的边缘检测图像(通常是经过边缘检测或灰度化的图像)。
  • method:霍夫变换的检测方法,通常为 HOUGH_GRADIENT,这是经典的霍夫圆检测方法。
  • dp:累加器分辨率的倒数。 dp=1 表示累加器的分辨率与输入图像相同; dp=2 表示累加器分辨率是输入图像的一半。
  • minDist:检测到的圆之间的最小距离,防止检测到多个重叠的圆。
  • param1:用于边缘检测的 Canny 边缘检测的阈值。
  • param2:累加器的阈值,值越高检测到的圆越少,越准确。
  • minRadius  maxRadius:定义圆的最小和最大半径范围。
#include <opencv2/opencv.hpp> 
//#include "quickopencv.h"
#include <iostream>
#include <math.h>
#include <opencv2/imgproc.hpp>
#include <vector>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
	Mat img = imread("path_to_img.jpg");
	//QuickDemo qd;
	//qd.hough_circle(img);
	resize(img, img, Size(img.cols, img.rows), 0, 0, INTER_LINEAR);
	imshow("img", img);
	if (img.empty()) {
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat gary;
	//将图像转换为灰度图
	cvtColor(img, gary, COLOR_BGR2GRAY);
	//高斯模糊
	//GaussianBlur(输入图像,输出图像,高斯核,X轴上的标准差,Y轴上的标准差);
	GaussianBlur(gary, gary, Size(9, 9), 2, 2);

	// 转换为二值图
	/*Mat binary;
	threshold(img, binary, 100, 255, cv::THRESH_BINARY);
	imshow("binary", binary);*/

	//检测圆形
	vector<Vec3f> circles;
	double dp = 1;		//累加器分辨率与图像分辨率的反比,如果dp=1,则累加器具有与输入图像相同的分辨率。如果dp=2,累加器的宽度和高度都是原来的一半。
	double minDist = 10;	//两个圆心的最小距离
	double param1 = 40;	//Canny边缘检测的较大阈值
	double param2 = 40;	//累加器阈值
	int min_radius = 1;	//圆形半径最小值
	int max_radius = 50;	//圆形半径最大值
	HoughCircles(gary, circles, HOUGH_GRADIENT, dp, minDist, param1, param2, min_radius, max_radius);


	//在图像中标记出圆形
	for (size_t i = 0; i < circles.size(); i++) {
		//读取圆心
		Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
		//读取半径
		int radius = cvRound(circles[i][2]);
		//绘制圆心
		circle(img, center, 3, Scalar(0, 255, 0), -1, 8, 0);
		// 设置圆心坐标的文本
		std::string centerText = "(" + std::to_string(center.x) + "," + std::to_string(center.y) + ")";
		// 计算文本框的大小
		cv::Size textSize = cv::getTextSize(centerText, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, nullptr);
		// 计算文本框的左下角位置,使其在圆心附近
		cv::Point textOrg((center.x - textSize.width / 2), (center.y + textSize.height / 2));
		// 在圆心处绘制文本
		cv::putText(img, centerText, textOrg, cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255), 1);
		//绘制圆
		circle(img, center, radius, Scala

4. 霍夫圆检测的应用场景

霍夫圆检测广泛应用于多个场景,包括但不限于:

  • 车轮、硬币等圆形物体检测;
  • 医学图像中细胞、眼球、病变区域的圆形检测;
  • 机器视觉中的工业零件检测。

霍夫圆检测是一种用于检测图像中圆形的算法。在OpenCV中,霍夫圆检测是基于图像梯度的实现。具体原理如下: 1. 首先,对图像进行中值滤波,以减少噪声的影响\[1\]。 2. 接下来,通过检测边缘来发现可能的圆心。这一步使用图像梯度的方法来计算边缘\[1\]。 3. 在第一步的基础上,从候选圆心开始计算最佳半径大小。这一步使用霍夫变换的方法来确定圆的半径\[1\]。 在OpenCV中,可以使用cv::HoughCircles函数来实现霍夫圆检测。该函数的参数包括输入图像、输出结果、方法、尺度因子、最短距离、Canny边缘检测的低阈值、中心点累加器阈值、最小半径和最大半径\[3\]。 总结来说,霍夫圆检测通过对图像进行中值滤波和边缘检测,然后使用霍夫变换来确定圆的位置和半径。这种方法可以有效地检测图像中的圆形物体。 #### 引用[.reference_title] - *1* [OpenCvSharp 学习笔记21-- 霍夫变换 - 圆检测 (Hough Circle transform)](https://blog.youkuaiyun.com/weixin_41049188/article/details/92422241)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [OpenCV 霍夫圆检测](https://blog.youkuaiyun.com/qq_44989881/article/details/116135750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [OpenCV20---霍夫圆检测](https://blog.youkuaiyun.com/qq_45646174/article/details/105086711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值