OpenCV C++霍夫圆查找

news2024/11/19 1:25:56

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. 霍夫圆检测的应用场景

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【韩顺平Java笔记】第3章:变量

只记录我觉得重点的&#xff0c;自用&#xff0c;如果有漏的请自己看视频 文章目录 33. 内容梳理34. 变量原理34.1 为什么需要变量35. 变量概念35.1 概念35.2 变量使用的基本步骤36. 变量入门36.1 变量使用入门案例 37. 变量细节37.1 变量使用注意事项 38. 加号使用38.1 程序中…

身份证号、定位信息等个人信息敏感性判定解析

关于身份证号号码以及精确定位信息是否是敏感个人信息的疑问一直以来不少合规安全从业者有疑惑&#xff0c;本文来自于《数安标准强基助力计划 》作者为指南和标准的起草者&#xff0c;其观点具有一定的权威性&#xff0c;一下为内容摘要&#xff0c;以供大家学习和解惑&#x…

【sourceTree问题】拉取提交的时候需要频繁输入账号密码

用sourceTree进行代码管理的时候会出现一直让输入账号密码的问题&#xff0c;烦不胜烦&#xff0c;可以点击【设置】 → 【编辑配置文件...】打开配置文件&#xff1a; 在配置文件里找到url&#xff0c;把url里面的网址修改为&#xff1a; http://username:passwordxxxxx/xx…

LeetCode 热题 100 回顾7

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战

作者&#xff1a;胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件&#xff0c;这个事件是 K8s 原生的事件&#xff0c;其实绝大多数的用户并不会关心&#xff0c;同时也可能看不懂。而事件中心&#xff0c;是希望能够…

实验3 使用Wiresharkl观察ping命令的工作过程

1、实验目的&#xff1a; 了解嗅探器工具Ethereal&#xff08;Wireshark&#xff09;的下载和安装方法&#xff1b; 掌握Ethereal&#xff08;Wireshark&#xff09;的简单使用方法&#xff1b; 了解抓包结果的分析方法&#xff08;最好是把菜单中所有的菜单命令都尝试一下&…

SpringCloud-Alibaba第二代微服务快速入门

1.简介 Spring Cloud Alibaba其实是阿里的微服务解决方案&#xff0c;是阿里巴巴结合自身微服务实践,开源的微服务全家桶&#xff0c;在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如&#xff1a;Eureak,zuul等。所以Sprin…

复刻谷歌爆火的AI生成播客应用:高效方案分享

随着Google Illuminate等产品的推出,将复杂文档转换为音频播客的需求日益增长。MIT最近开源的PDF2Audio项目为此提供了一个开放且高效的解决方案。本文将详细介绍如何复刻这一功能,并分享一个适用于AI代理和播客创业者的高效方案。 一、背景 近年来,将文本内容转换为音频播…

第一课:什么是易语言?

易语言是一门计算机程序设计语言&#xff0c;也通常代指与之对应的集成开发环境&#xff0c;其特点是通过汉语进行编程。易语言的创始人是吴涛。早期版本的名字为E语言。 简单的说&#xff0c;易语言是一个小型的软件开发系统。(就是写程序用的&#xff0c;够通俗吧&#xff1f…

Vue76 编程式路由导航

笔记 作用&#xff1a;不借助<router-link> 实现路由跳转&#xff0c;让路由跳转更加灵活 具体编码&#xff1a; //$router的两个API this.$router.push({name:xiangqing,params:{id:xxx,title:xxx} })this.$router.replace({name:xiangqing,params:{id:xxx,title:xxx} …

LeetCode 热题 100 回顾19

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

buuctf_藏藏藏

题目&#xff1a;没什么&#xff0c;一张图片&#xff0c;叫“藏藏藏.jpg” winhex&#xff0c;隐写看了&#xff0c;没什么结果 上kali&#xff0c;为了方便&#xff0c;我将图片命名为0.jpg。本文将讲述我遇到的俩个难点 1.kali未配置打不出中文字符 2.kali打不开docx 下面是…

1.2.1 计算机网络分层结构(上)

体系结构可分层使得不同的层次承担不同的功能。 知识点&#xff1a; 1.不同类型的节点&#xff0c;实现的功能层次可能不一样。 2.分层结构的设计并不唯一&#xff0c;可以根据实际需求增加或减少层次。 3.一个功能可以放在不同的层次反复出现。 根据分层结构不同可以分为&…

一维BFS模型

算法竞赛题目中有一种常见的一维BFS模型。 这种模型的特点是&#xff0c;某一个状态的值可以有上一个状态的值1来获得&#xff08;也就是说一条通道的权重是1&#xff09;。 比如例题&#xff1a; 农夫知道一头牛的位置&#xff0c;想要抓住它。 农夫和牛都位于数轴上&#x…

WPF之UI进阶--控件样式与样式模板及词典

WPF的优势之一就是能够更加容易快捷的对窗体和控件的外面进行改造&#xff0c;换句话说&#xff0c;那就是UI设计个性化更加容易。主要是借助了样式、模板及词典来实现的。那么本篇博文就一一对他们进行介绍。 文章目录 一、样式1: 定义样式2: 使用Setter设置属性关于Property和…

初识Linux · 地址空间

目录 前言&#xff1a; 代码现象 快速理解该现象 理解部分细节问题 细节1 拷贝和独立性 细节2 如何理解地址空间 细节3 为什么存在地址空间 细节4 如何进一步理解页表和写时拷贝 前言&#xff1a; 本文介绍的是有关地址空间&#xff0c;咱们的介绍的大体思路是&#x…

pyqt打包成exe相关流程

1、首先是安装pyinstaller, 在cmd中输入以下安装命令&#xff1a; pip3 install pyinstaller -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ 2、安装完毕之后&#xff0c;下一步就是找到你要打包的工程&#xff0c;打包的logo放置如下位置&#xff1a; 3、将log…

甘肃小米醋:醇厚滋味,传承之香

宝子们&#xff0c;今天来给大家介绍一下甘肃的小米醋。✨甘肃小米醋&#xff0c;那是一种带着浓郁地域特色的美味宝藏。&#x1f381;&#x1f33e;以优质小米为原料&#xff0c;经过传统工艺的精心酿造&#xff0c;成就了这一瓶瓶醇厚的小米醋。打开瓶盖&#xff0c;那独特的…

class 028 基数排序

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

Redis string类型hash类型

string类型 类型介绍 在Redis中的所有的key都是string类型&#xff0c;而value的类型有多种。 Redis中的字符串是直接按照二进制的方式进行存储的&#xff0c;也就是不会做任何的编码转换&#xff0c;存的是什么&#xff0c;取出来的就是什么。这样一般来说&#xff0c;Redi…