目标

在本教程中,您将学习如何:使用OpenCV函数cv :: HoughCircles来检测图像中的圆。

理论

Hough Circle变换Hough Circle变换的工作原理与上一个教程中解释的Hough Line变换大致相似。

在行检测案例中,一行由两个参数(r,θ)。在圆圈中,我们需要三个参数来定义一个圆:

 (xcenter,ycenter)

定义中心位置(绿点),r是半径,这允许我们完全定义一个圆,如下所示:

为了实现效率,OpenCV实现了一个比标准霍夫变换(Hough Transform)稍微棘手的检测方法:霍夫梯度法,由两个主要阶段组成。第一阶段涉及边缘检测并找到可能的圆心,第二阶段为每个候选中心找到最佳的半径。有关更多详细信息,请查看学习OpenCV或您最喜欢的计算机视觉参考书

Code这个程序是做什么的?加载图像并使其模糊,

以减少噪音将Hough Circle变换应用于模糊图像。

在窗口中显示检测到的圆。我们将从这里下载我们将要解释的示例代码。这里可以找到一个稍微推荐的版本(显示用于更改阈值的轨迹条)。#include "opencv2/imgcodecs.hpp"

#include "opencv2/highgui.hpp"

#include "opencv2/imgproc.hpp"

#include

using namespace cv;

using namespace std;

static void help()

{

cout << "\nThis program demonstrates circle finding with the Hough transform.\n"

"Usage:\n"

"./houghcircles , Default is ../data/board.jpg\n" << endl;

}

int main(int argc, char** argv)

{

cv::CommandLineParser parser(argc, argv,

"{help h ||}{@image|../data/board.jpg|}"

);

if (parser.has("help"))

{

help();

return 0;

}

string filename = parser.get("@image");

Mat img = imread(filename, IMREAD_COLOR);

if(img.empty())

{

help();

cout << "can not open " << filename << endl;

return -1;

}

Mat gray;

cvtColor(img, gray, COLOR_BGR2GRAY);

medianBlur(gray, gray, 5);

vector 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];

circle( img, Point(c[0], c[1]), c[2], Scalar(0,0,255), 3, LINE_AA);

circle( img, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, LINE_AA);

}

imshow("detected circles", img);

waitKey();

return 0;

}

说明加载图像string filename = parser.get("@image");

Mat img = imread(filename, IMREAD_COLOR);

if(img.empty())

{

help();

cout << "can not open " << filename << endl;

return -1;

}将其转换为灰度:Mat gray;

cvtColor(img, gray, COLOR_BGR2GRAY);应用中值模糊以减少噪音,避免假圈检测:medianBlur(gray, gray, 5);

继续应用Hough Circle变换:vector 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

);

有论据:gray:输入图像(灰度)。

circles:存储套3个的值的矢量:为每个检测到的圆。xc,yc,r

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];

circle( img, Point(c[0], c[1]), c[2], Scalar(0,0,255), 3, LINE_AA);

circle( img, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, LINE_AA);

}

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

显示检测到的圆,并等待用户退出程序:imshow("detected circles", img);

waitKey();

结果

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

houghcircle函数_Hough Circle 变换相关推荐

  1. R语言tidyr包pivot_longer函数、pivot_wider函数数据表变换实战(长表到宽表、宽表到长表)

    R语言tidyr包pivot_longer函数.pivot_wider函数数据表变换实战(长表到宽表.宽表到长表) 目录

  2. 函数平移口诀_呆哥数学函数合集——函数的图形变换来啦【4】

    函数图像变幻莫测哈哈哈 呆哥今天给你们整理的要点!注意查收! [电子档领取] 如果想要获取往期电子版讲义.数学笔记手写稿 可以加我微信:daigemath666备注:一轮复习讲义电子版或手写稿 4. ...

  3. 用S-FUNCTION函数编写dq变换

    用S-FUNCTION函数编写dq变换 代码部分 function [sys,x0,str,ts]=park(t,x,u,flag) switch flagcase 0[sys,x0,str,ts]= ...

  4. 求下列函数的拉普拉斯变换_试求下列函数的拉氏变换.pdf

    试求下列函数的拉氏变换 习 题 2-1 试求下列函数的拉氏变换 (1) 2 (f )t t 3 t+2 + 2 3 2 解:F s =+ + ( ) 3 2 s s s (2 ) f t ( ) 5 ...

  5. 一些常用函数的拉普拉斯变换

    一. 冲激δ(t)\bm{δ(t)}δ(t) 单位冲激信号的傅里叶变换和拉普拉斯变换均为1 二. 冲激序列 三. 阶跃信号 四. 单边指数衰减信号 五. tn\bm{t^n}tn 六. sin(t)和 ...

  6. matlab resampc函数,基于contourlet变换的红外与可见光图像融合matlab源码

    基于contourlet变换的红外与可见光图像融合matlab源码 matlab 2020-12-1 下载地址 https://www.codedown123.com/53619.html 基于con ...

  7. 沃尔什函数 与 沃尔什-哈达玛变换

    图像处理中有许多变换常常选用方波信号或者它的变形. 沃尔什函数是一组矩形波,其取值为1和-1,非常便于计算机运算. 沃尔什函数有三种排列或编号方式,以哈达玛排列最便于快速计算. 采用哈达玛排列的沃尔什 ...

  8. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  9. C语言程序设计(常用函数说明)

    C语言程序设计(常用函数说明) C 语言是1972年由美国的Dennis Ritchie设计发明的,并首次在UNIX操作系统的 DEC PDP-11计算机上使用.它由早期的编程语言 BCPL(Basi ...

最新文章

  1. [UT]Unit Test理解
  2. php中strrpos函数的返回值类型是型_PHP常用函数总结
  3. linux系统下开机启动流程
  4. OpenFOAM安装教程(史上最全:OpenFOAM、ParaView、OpenFOAM多版本共存)
  5. linux上点时间延时,Linux上时间和定时器
  6. 数据结构之--冒泡排序的三种实现
  7. java test20006_Java单例7种测试实践
  8. LeetCode(235)——二叉搜索树的最近公共祖先(JavaScript)
  9. 微信支付金额为0.01分报错,和少一分钱的解决办法
  10. Route@简单应用
  11. 规避VMware虚拟机检测
  12. 生信自学笔记(三)分子数据库
  13. 长江大学计算机地质绘图,石文油气藏地质智能绘图系统
  14. html制作日程安排,如何制作一个Web日程安排表?
  15. 学计算机应用技术买什么笔记本电脑,大学什么专业用电脑 要不要买电脑
  16. 这么多年你还在怕正则吗?
  17. 华为视频会议TE40
  18. LB10S-ASEMI贴片整流桥LB10S
  19. bitmap.compress(图片压缩的两种方式)(1,质量压缩;2,采样率压缩)
  20. 用python整个活(2)——用numpy做一个蜘蛛纸牌

热门文章

  1. JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用[转载]
  2. 外推主要发布平台(JM)
  3. 【转】Linux下的多线程编程背景知识
  4. 如何安全地迁移到Exchange 2003?
  5. countif函数比较两列不同_这些Excel函数公式,职场办公天天用,赶紧掌握!
  6. 1流式细胞术荧光比值计算_流式细胞术技巧攻略!
  7. 麦吉尔大学 计算机科学和阿尔伯特,阿尔伯特大学怎么样?
  8. java5错误_Error:java: 错误: 不支持发行版本 5
  9. JUC阻塞队列BlockingQueue讲解
  10. 3-31Pytorch与auto-variabletensor