OpenCV 实现霍夫圆变换

news2024/11/17 8:18:09

返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV实现霍夫变换
下一篇:OpenCV 实现重新映射

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 HoughCircles()检测图像中的圆圈。

理论

Hough 圆变换

  • Hough Circle 变换的工作方式与上一教程中介绍的 Hough Line 变换大致相似。
  • 在线路检测情况下,一条线路由两个参数 (r,Q)定义。在圆的情况下,我们需要三个参数来定义一个圆:

    其中 (xcenter,ycenter)定义中心位置(绿点,),r是半径,这让我们可以完全定义一个圆,如下图所示:

  • 为了提高效率,OpenCV 实现了一种比标准 Hough 变换稍微棘手的检测方法:Hough 梯度方法,它由两个主要阶段组成。第一阶段涉及边缘检测和查找可能的圆心,第二阶段为每个候选中心找到最佳半径。有关更多详细信息,请查看《学习 OpenCV》一书或您最喜欢的计算机视觉参考书目
  • 这个程序是做什么的?

  • 加载图像并对其进行模糊处理以减少噪点
  • 将 Hough Circle 变换应用于模糊图像。
  • 在窗口中显示检测到的圆圈。

C++代码

我们将要解释的示例代码可以从这里下载。可以在此处找到一个稍微花哨的版本(显示用于更改阈值的跟踪栏)。

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
 
using namespace cv;
using namespace std;
 
int main(int argc, char** argv)
{
 const char* filename = argc >=2 ? argv[1] : "smarties.png";
 
 // Loads an image
 Mat src = imread( samples::findFile( filename ), IMREAD_COLOR );
 
 // Check if image is loaded fine
 if(src.empty()){
 printf(" Error opening image\n");
 printf(" Program Arguments: [image_name -- default %s] \n", filename);
 return EXIT_FAILURE;
 }
 
 Mat gray;
 cvtColor(src, gray, COLOR_BGR2GRAY);
 
 medianBlur(gray, gray, 5);
 
 vector<Vec3f> circles;
 HoughCircles(gray, circles, HOUGH_GRADIENT, 1,
 gray.rows/16, // change this value to detect circles with different distances to each other
 100, 30, 1, 30 // change the last two parameters
 // (min_radius & max_radius) to detect larger circles
 );
 
 for( size_t i = 0; i < circles.size(); i++ )
 {
 Vec3i c = circles[i];
 Point center = Point(c[0], c[1]);
 // circle center
 circle( src, center, 1, Scalar(0,100,100), 3, LINE_AA);
 // circle outline
 int radius = c[2];
 circle( src, center, radius, Scalar(255,0,255), 3, LINE_AA);
 }
 
 imshow("detected circles", src);
 waitKey();
 
 return EXIT_SUCCESS;
}

解释

我们使用的图像可以在这里找到

加载图像:

 const char* filename = argc >=2 ? argv[1] : "smarties.png";
 
 // Loads an image
 Mat src = imread( samples::findFile( filename ), IMREAD_COLOR );
 
 // Check if image is loaded fine
 if(src.empty()){
 printf(" Error opening image\n");
 printf(" Program Arguments: [image_name -- default %s] \n", filename);
 return EXIT_FAILURE;
 }

将其转换为灰度:

 Mat gray;
 cvtColor(src, gray, COLOR_BGR2GRAY);

应用中值模糊以减少噪点并避免误圆检测:

 medianBlur(gray, gray, 5);

继续应用 Hough Circle 变换:

 vector<Vec3f> circles;
 HoughCircles(gray, circles, HOUGH_GRADIENT, 1,
 gray.rows/16, // change this value to detect circles with different distances to each other
 100, 30, 1, 30 // change the last two parameters
 // (min_radius & max_radius) to detect larger circles
 );
  • 带有参数:
    • 灰色:输入图像(灰度)。
    • circles:存储 3 个值集的向量:xc1,yc1 对于每个检测到的圆。
    • HOUGH_GRADIENT:定义检测方法。目前,这是 OpenCV 中唯一可用的。
    • dp = 1:分辨率的倒比。
    • min_dist = gray.rows/16:检测到的中心之间的最小距离。
    • param_1 = 200:内部 Canny 边缘检测器的上限阈值。
    • param_2 = 100*:中心检测的阈值。
    • min_radius = 0:要检测的最小半径。如果未知,则将零作为默认值。
    • max_radius = 0:要检测的最大半径。如果未知,则将零作为默认值。

绘制检测到的圆圈:

 for( size_t i = 0; i < circles.size(); i++ )
 {
 Vec3i c = circles[i];
 Point center = Point(c[0], c[1]);
 // circle center
 circle( src, center, 1, Scalar(0,100,100), 3, LINE_AA);
 // circle outline
 int radius = c[2];
 circle( src, center, radius, Scalar(255,0,255), 3, LINE_AA);
 }

你可以看到,我们将用红色画圆圈,用一个小绿点画中心

显示检测到的圆圈并等待用户退出程序:

 imshow("detected circles", src);
 waitKey();

结果

使用测试图像运行上述代码的结果如下所示:


参考文献:

1、《Hough Circle Transform》------Ana Huamán

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

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

相关文章

模拟从D盘查找图片文件进行预览改进版

<style>#files button {margin-right: 10px;background-color: #0b4180;color: white;}#files button:hover {background-color: #00B83F;color: #0C0C0C;}#file-list li:hover {cursor: pointer;color: red;}#showImg {width: 100%; /* 图片宽度100% */max-height: 80vh…

三种类的免费SSL证书

目前主流的三种域名证书&#xff1a;单域名证书、多域名证书、通配符泛域名证书。 这三种类型的证书根据用户域名的不同情况&#xff0c;应用场景也大不相同。 单域名证书应用场景&#xff1a; 针对于有且只有一个单独域名的单位&#xff0c;使用单域名证书是刚好能够满足需求…

python逆向基础流程(纯小白教程)

一&#xff0c;例题链接 NSSCTF | 在线CTF平台 二&#xff0c;文件特征 使用工具查看文件信息&#xff0c;发现是pyinsatller打包的exe文件&#xff0c;如果硬用ida分析成汇编或c语言根本摸清楚程序的逻辑&#xff0c;所以思路是反编译成py文件直接分析python代码 三&#xf…

Idea:阿里巴巴Java编码插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Alibaba Java Coding …

性能测试学习一

文章目录 什么是性能测试性能项目分类性能测试流程在这里插入图片描述 场景分类基准场景 容量场景稳定性场景性能指标性能指标 分布式压测 日期&#xff1a;2024年4月19日 从今日起开始系统更新性能测试学习笔记&#xff0c;一方面督促自身的学习进度&#xff0c;另一方面提高专…

网络爬虫之HTTP原理

** URI和URL URI的全称Uniform Resource Identifier &#xff0c;即统一资源标志符。URL的全称Uniform Resource Locator 即统一资源定位符。 URL是URI的子集&#xff0c;也就是每一个URL就是URI&#xff0c;但是每一个URI不一定是URL&#xff0c;URI还有一个子类叫URN&#x…

企业微信hook接口协议,ipad协议http,发送大视频文件

发送大视频文件 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"1688853790xxx", //uuid 默认随机生成如果初始化传了id则用初始…

数组和指针有什么区别?

数组&#xff08;Array&#xff09;和指针&#xff08;Pointer&#xff09;是计算机编程中常见的两种数据类型&#xff0c;它们在内存中的表示和使用方式有着显著的区别。 1. 内存中的表示&#xff1a; 数组&#xff1a; 数组是一组相同类型的元素在内存中连续存储的集合。在…

企业数字化管理是什么,如何建立企业数字化管理?

前言 随着信息技术的迅猛发展和数字化浪潮的席卷&#xff0c;企业数字化管理已成为现代企业管理的重要趋势。数字化管理不仅有助于提升企业的运营效率和市场竞争力&#xff0c;还能为企业创造更多的商业价值和机遇。因此&#xff0c;深入了解和掌握企业数字化管理的内涵和建立…

【企业管理战略方案设计】经营驱动与管理控制相结合

在企业发展过程中&#xff0c;是经营为先&#xff0c;还是管理为先&#xff1f;是经营重要还是管理重要&#xff1f;不同的人可能会有不同的答案&#xff0c;也会有不同的简介。但是如何将经营与管理有机地结合在一起&#xff0c;将冲锋陷阵的前方经营与补充粮草的后方管理加以…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

前端单元测试的艺术:专业化策略与Vue项目高效实践指南

单元测试是软件开发中的基石&#xff0c;尤其对于前端领域&#xff0c;它为保证代码质量、提升开发效率、强化项目稳定性提供了不可或缺的支持。本文将深入剖析单元测试的核心理念&#xff0c;揭示其在前端开发中的独特价值&#xff0c;并提炼出一套专业且高效的实践策略&#…

闲谈工作边界

在程序员的日常工作中&#xff0c;会遇到很多边界问题。如果这些边界问题不处理好&#xff0c;会面临诸多问题。切不可忽略边界问题&#xff0c;因为这些边界很有可能是日后帮助你摆脱扯皮&#xff0c;避免被甩锅&#xff0c;甚至于好心办坏事。 那么我们来谈一下如何处理边界问…

关于螺栓的注意事项和正确操作方法——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓&#xff0c;作为一种常见的紧固件&#xff0c;广泛应用于各种机械设备和结构中。在日常生活和工作中&#xff0c;我们经常需要接触到螺栓&#xff0c;因此了解螺栓的一些注意事项和正确操作方法对于确保设备的安全…

ASP.NET集成客户关系管理的企业网站的设计与开发

摘 要 企业要在激烈的市场竞争中立于不败之地&#xff0c;就必须找一种全新的管理理念和管理手段&#xff0c;对其内部和外部资源进行有效的整合。新一代ERP产品正在向客户端和供应端延伸&#xff0c;客户端的延伸即是客户关系管理。对于每个企业来说客户管理的完善程度将直接…

2024新版计算机网络视频教程65集完整版(视频+配套资料)

今日学计算机网络&#xff0c;众生皆叹难理解。 却见老师神乎其技&#xff0c;网络通畅如云烟。 协议层次纷繁复杂&#xff0c;ARP、IP、TCP、UDP。 路由器交换机相连&#xff0c;数据包穿梭无限。 网络安全重于泰山&#xff0c;防火墙、加密都来添。 恶意攻击时刻存在&#xf…

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

【openLooKeng-1.10.0集群环境安装部署】

openLooKeng-1.10.0集群环境安装部署 一、摘要二、正文1. 环境说明2. 集群拓扑图3. 安装过程(以root用户安装)3.1 在Coordinator和Worker两个节点都需要安装jdk1.8+3.2 在Coordinator上安装配置openLooKeng3.3 在Worker节点上进行配置openLooKeng3.4 在Coordinator节点上先启…

Oracle Analytics BIEE 操作方法(六)数据格式1:百分比

问题&#xff1a; 有如下公式&#xff0c;将数据显示为按行的百分比。此时数据显示只会有一位小数。想显示两位 解决方案 在分析中找到“高级”标签&#xff0c;将“分析XML”中内容复制出来 替换 将&#xff1a;minDigits“1” maxDigits“1” 替换为&#xff1a;minDigits…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…