当前位置: 首页 > news >正文

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

在灰度图像中使用霍夫变换查找圆形。

该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。
例子:

#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{Mat img, gray;if( argc != 2 || !(img=imread(argv[1], IMREAD_COLOR)).data)return -1;cvtColor(img, gray, COLOR_BGR2GRAY);// smooth it, otherwise a lot of false circles may be detectedGaussianBlur( gray, gray, Size(9, 9), 2, 2 );vector<Vec3f> circles;HoughCircles(gray, circles, HOUGH_GRADIENT,2, gray.rows/4, 200, 100 );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]);// draw the circle centercircle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );// draw the circle outlinecircle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );}namedWindow( "circles", 1 );imshow( "circles", img );waitKey(0);return 0;
}

注意:

通常该函数能够很好地检测圆形的中心。然而,它可能无法正确找到半径。如果你知道半径范围,可以通过指定 minRadius 和 maxRadius 来帮助函数。或者,在使用 HOUGH_GRADIENT 方法的情况下,你可以将 maxRadius 设置为一个负数,以仅返回中心而不进行半径搜索,并使用额外的过程来找到正确的半径。
对图像进行轻微的平滑处理也有帮助,除非图像本身已经很平滑。例如,使用大小为 7x7 的高斯核和 1.5x1.5 的 sigma 进行 GaussianBlur() 或类似的模糊处理可能会有帮助。

HoughCircles 是 OpenCV 中用于检测图像中圆形的一个函数。Hough 变换是一种用于检测图像中特定形状的技术,尤其是直线和圆形。HoughCircles 实现了 Hough 变换的一个变种,专门用于检测圆形。

函数原型

void cv::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: 输出的检测到的圆形向量。每个向量编码为包含 3 或 4 个元素的浮点数向量(x, y, 半径)或(x, y, 半径, 投票数)。

  • 参数method: 检测方法,参见 HoughModes。可用的方法包括 HOUGH_GRADIENT 和 HOUGH_GRADIENT_ALT。

  • 参数dp: 累加器分辨率与图像分辨率的逆比。例如,如果 dp=1,累加器具有与输入图像相同的分辨率。如果 dp=2,累加器的宽度和高度各为输入图像的一半。对于 HOUGH_GRADIENT_ALT,推荐的值是 dp=1.5,除非需要检测一些非常小的圆形。

  • 参数minDist: 检测到的圆形中心之间的最小距离。如果该参数太小,可能会错误地检测到多个相邻的圆形。如果太大,某些圆形可能会被遗漏。

  • 参数param1: 第一个特定于方法的参数。在 HOUGH_GRADIENT 和 HOUGH_GRADIENT_ALT 的情况下,它是传递给 Canny 边缘检测器的较高阈值(较低的阈值是较高阈值的一半)。注意 HOUGH_GRADIENT_ALT 使用 Scharr 算法来计算图像的导数,所以阈值通常应该更高,例如 300 或者适用于正常曝光和对比度较高的图像。

  • 参数param2: 第二个特定于方法的参数。在 HOUGH_GRADIENT 的情况下,它是检测阶段的累加器阈值,用于圆心。该值越小,可能检测到的虚假圆形越多。对应的累加器值较大的圆形将优先返回。在 HOUGH_GRADIENT_ALT 算法中,这是圆形的“完美度”度量。该值越接近 1,算法选择的圆形形状越好。大多数情况下 0.9 应该是合适的。如果你想更好地检测小圆形,可以将其减小到 0.85、0.8 或甚至更小。但同时也要尝试限制搜索范围 [minRadius, maxRadius] 以避免出现许多虚假圆形。

  • 参数minRadius: 最小圆形半径。

  • 参数maxRadius: 最大圆形半径。如果 <= 0,使用最大图像尺寸。如果 < 0,HOUGH_GRADIENT 返回中心而不查找半径。HOUGH_GRADIENT_ALT 总是计算圆形的半径。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main( int argc, char** argv )
{// 加载图像cv::Mat img = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg", cv::IMREAD_COLOR );if ( !img.data ){std::cout << "No image data" << std::endl;return -1;}cv::imshow( "Original Image", img );// 转换为灰度图cv::Mat gray;cvtColor( img, gray, cv::COLOR_BGR2GRAY );// 高斯模糊减少噪声cv::GaussianBlur( gray, gray, cv::Size( 9, 9 ), 2, 2 );std::vector< cv::Vec3f > circles;  // 存储检测到的圆形信息// 设置参数double dp      = 1;             // 累加器分辨率double minDist = img.rows / 8;  // 圆心之间的最小距离double param1  = 100;           // 边缘检测的高阈值double param2  = 30;            // 累加器阈值int minRadius  = 0;             // 最小半径int maxRadius  = 0;             // 最大半径// 使用 HoughCircles 检测圆形cv::HoughCircles( gray, circles, cv::HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius );// 绘制检测到的圆形for ( size_t i = 0; i < circles.size(); i++ ){cv::Vec3i c = circles[ i ];cv::Point center( cvRound( c[ 0 ] ), cvRound( c[ 1 ] ) );int radius = cvRound( c[ 2 ] );// 绘制圆心cv::circle( img, center, 1, cv::Scalar( 0, 100, 100 ), 3, cv::LINE_AA );// 绘制圆周cv::circle( img, center, radius, cv::Scalar( 255, 0, 0 ), 3, cv::LINE_AA );}// 显示带有检测出圆形的图像cv::imshow( "Detected Circles", img );// 等待按键后关闭窗口cv::waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在灰度图像中使用霍夫变换查找圆形。 该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。 例子&#xff1a; #include <opencv2/imgp…...

spark 大表与大表join时的Shuffle机制和过程

在 Spark 中&#xff0c;当处理大表与大表的 JOIN 操作时&#xff0c;通常会涉及到 Shuffle 机制&#xff0c;这是分布式计算中用于重新分布数据的关键步骤。Shuffle 的本质是将数据按照某种方式重新分组&#xff0c;使得相同 key 的数据能够被发送到同一个计算节点进行后续的操…...

大厂面试真题:简单说下Redis的bigkey

什么是bigkey bigkey是指key对应的value所占的内存空间比较大&#xff0c;例如一个字符串类型的value可以最大存到512MB&#xff0c;一个列表类型的value最多可以存储23-1个元素。 如果按照数据结构来细分的话&#xff0c;一般分为字符串类型bigkey和非字符串类型bigkey。 字…...

18 vue3之自动引入ref插件深入使用v-model

自动引入插件后无需再引入ref等 使用自动引入插入无需在import { ref, reactive } from "vue"做这样的操作 npm i unplugin-auto-import - D vite配置 import AutoImport from unplugin-auto-import/vite //使用vite版本 export default defineConfig({plugins: [v…...

【Spring】lombok、dbUtil插件应用

一、lombok插件 1. 功能&#xff1a;对实体类自动&#xff0c;动态生成get、set方法&#xff0c;无参、有参构造..... 2. 步骤&#xff1a; &#xff08;1&#xff09;idea安装插件(只做一次) &#xff08;2&#xff09;添加坐标 &#xff08;3&#xff09;编写注解 NoArgsCo…...

【学习笔记】WSL

WSL 1、 介绍 1.1、概述 1.2、版本 1.3、配置安装 2、 基本 2.1、基本命令 1、 介绍 1.1、概述 WSL 是 Windows Subsystem for Linux 的缩写&#xff0c;中文称为 Windows 下的 Linux 子系统。它是微软在 Windows 上提供的一种功能&#xff0c;允许用户在 …...

python assert 断言用法

语法&#xff1a; try:assert 条件表达式, "可选的错误消息" except AssertionError as error:print(f"断言失败&#xff1a;{error}")其中&#xff0c; try...except是异常处理语法结构&#xff0c;try可以测试代码块中的错误&#xff0c;并在出现异常时…...

MySQL事务、索引、数据恢复和备份

MySQL事务、索引、数据恢复和备份 1.MySQL的事务处理 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错&#xff0c;则该批次内的所有SQL都将被取消执行 MySQL的事务实现方法 : SET AUTOCOMMIT 使用SET语句来改变自动提交模式 SET AUTOCOMMIT 0; # 关…...

什么是chatgpt?国内有哪些类gpt模型?

什么是ChatGPT&#xff1f; “ChatGPT”这个名字越来越多地出现在我们的生活中。简单来说&#xff0c;ChatGPT是OpenAI开发的一种人工智能对话模型。它基于GPT&#xff08;Generative Pre-trained Transformer&#xff0c;生成式预训练变换模型&#xff09;架构&#xff0c;能…...

ISP基本框架及算法介绍 ISP(Image Signal Processor)

ISP基本框架及算法介绍 ISP(Image Signal Processor)&#xff0c;即图像处理&#xff0c;主要作用是对前端图像传感器输出的信号做后期处理&#xff0c;主要功能有线性纠正、噪声去除、坏点去除、内插、白平衡、自动曝光控制等&#xff0c;依赖于ISP才能在不同的光学条件…...

Stable Diffusion 的 ControlNet 主要用途

SD&#xff08;Stable Diffusion&#xff09;中的ControlNet是一种条件生成对抗神经网络&#xff08;Conditional Generative Adversarial Network, CGAN&#xff09;的扩展技术&#xff0c;它允许用户通过额外的输入条件来控制预训练的大模型&#xff08;如Stable Diffusion&a…...

矩阵分析 学习笔记4 内积与Gram矩阵

内积 定义 由于对称&#xff0c;第二变元线性那第一变元也线性了。例如这个&#xff1a;...

iOS 消息机制详解

应用 解决NSTimer、CADisplayLink循环引用。 二者都是基于runloop的定时器&#xff0c;由于处理事件内容不一样&#xff0c;runloop 每运行一次运行耗时就不一样&#xff0c;无法准确的定时触发timer的事件。 NSProxy 与 NSObject 如果继承自NSProxy 直接开始消息转发&…...

深入理解Spring Data JPA与接口编程

目录 1. 什么是Spring Data JPA&#xff1f; 2. 如何使用Spring Data JPA&#xff1f; 3. 示例代码 4. 使用Query注解 5. 拓展知识&#xff1a;接口编程的好处 6. 结论 在软件开发领域&#xff0c;接口&#xff08;Interface&#xff09;是一种定义了方法签名但没有实现的…...

Wireshark学习使用记录

wireshark 是一个非常好用的抓包工具&#xff0c;使用 wireshark 工具抓包分析&#xff0c;是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境&#xff0c;另外一种就是应用比较多的互联网环境&#xff0c;也就是连接…...

OpenCV特征检测(9)检测图像中直线的函数HoughLines()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中使用标准 Hough 变换查找直线。 该函数实现了用于直线检测的标准 Hough 变换或标准多尺度 Hough 变换算法。详见 http://homepages…...

力扣 中等 445.两数相加 II

文章目录 题目介绍题解 题目介绍 题解 首先反转两个链表&#xff0c;再调用 2. 两数相加 链接的代码&#xff0c;得到链表&#xff0c;最后将其翻转即可。 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {l1 reverseList(l1);l2 reverseList(l…...

华为云徐峰:AI赋能应用现代化,加速软件生产力跃升

2024年9月19日&#xff0c;在华为全联接大会2024的“AI赋能应用现代化&#xff0c;加速软件生产力跃升”论坛上&#xff0c;华为云PaaS服务产品部部长徐峰发表了主题演讲&#xff0c;介绍了未来应用智能化演进趋势&#xff0c;分享了智能化应用的行业实践&#xff0c;并发布了华…...

C发送邮件技巧:如何批量发送个性化邮件?

C发送邮件的高效步骤指南&#xff1f;C语言怎么实现SMTP发邮件&#xff1f; 为了提高邮件营销的效果&#xff0c;掌握C发送邮件的技巧&#xff0c;特别是如何批量发送个性化邮件&#xff0c;显得尤为重要。AokSend将详细介绍C发送邮件的技巧&#xff0c;帮助您在邮件营销中取得…...

基于python+spark的外卖餐饮数据分析系统设计与实现(含论文)-Spark毕业设计选题推荐

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...