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

news/2024/9/29 3:29:26/
  • 操作系统: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;
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/news/1530798.html

相关文章

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容&#xff0c;流畅地…

零成本玩转企业微信!2024年邮箱功能新升级,速来get√

在这个网络时代&#xff0c;公司聊天和管理得快不快&#xff0c;对公司能不能赢很关键。企业微信是腾讯给公司做的聊天和办公工具&#xff0c;因为功能多、用着方便&#xff0c;很多公司都喜欢用。不过&#xff0c;新用企业微信的公司最想知道的是&#xff1a;用这个要不要花钱…

Spring Boot框架:蜗牛兼职网实现

第3章 系统分析 3.1 需求分析 蜗牛兼职网主要是为了提高工作人员的工作效率和更方便快捷的满足用户和企业&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户和企业的可操作性&#xff0…

Java律师法律咨询小程序

技术&#xff1a;Java、Springboot、mybatis、Vue、Mysql、微信小程序 1.代码干净整洁&#xff0c;可以快速二次开发和添加新功能 2.亮点可以添加AI法律咨询作为 创新点 系统分&#xff1a;用户小程序端&#xff0c;律师web端和管理员端 用户可以在小程序端登录系统进入首…

如何进行Ubuntu磁盘空间深度清理?

近期使用AutoDL算力云&#xff0c;发现系统盘只有30G&#xff0c;数据盘只有50G&#xff0c;跑一个稍微大一点的模型&#xff0c;马上空间就拉爆了&#xff0c;现在做一个磁盘深度清理操作&#xff0c;看看效果。 清理前磁盘占用如下&#xff1a; 在 Ubuntu 系统中进行磁盘深度…

JVM 基础知识(基础组成 )

使用场景 线上系统突然宕机,系统无法访问,甚至直接 O0M;线上系统响应速度太慢,优化系统性能过程中发现 CPU 占用过高,原因也许是因为 JVM的 GC 次数过于频繁;新项目上线,需要设置 JVM的各种参数;等 JDK / JRE / JVM JDK JDK 全称 ( Java Development Kit ) &#xff0c;是 Ja…

Exception与Error:Java中的异常处理

在Java编程中&#xff0c;异常处理是一个非常重要的概念。它允许程序在遇到错误时优雅地处理&#xff0c;而不是突然崩溃。Java通过Exception和Error类来区分不同类型的错误情况&#xff0c;并通过一套完整的异常处理机制来管理这些错误。 异常&#xff08;Exception&#xff…

当 PC 端和移动端共用一个域名时,避免 CDN 缓存页面混乱(nginx)

在当今的互联网时代&#xff0c;网站的访问体验对于用户来说至关重要。而在网站开发中&#xff0c;有时会出现 PC 端和移动端使用两套不同代码却共用一个域名的情况&#xff0c;这就可能导致一系列问题&#xff0c;其中之一就是 CDN 为 PC 端缓存移动端页面。 先来看看为什么会…