houghcircle函数_Hough Circle 变换
目标
在本教程中,您将学习如何:使用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 变换相关推荐
- R语言tidyr包pivot_longer函数、pivot_wider函数数据表变换实战(长表到宽表、宽表到长表)
R语言tidyr包pivot_longer函数.pivot_wider函数数据表变换实战(长表到宽表.宽表到长表) 目录
- 函数平移口诀_呆哥数学函数合集——函数的图形变换来啦【4】
函数图像变幻莫测哈哈哈 呆哥今天给你们整理的要点!注意查收! [电子档领取] 如果想要获取往期电子版讲义.数学笔记手写稿 可以加我微信:daigemath666备注:一轮复习讲义电子版或手写稿 4. ...
- 用S-FUNCTION函数编写dq变换
用S-FUNCTION函数编写dq变换 代码部分 function [sys,x0,str,ts]=park(t,x,u,flag) switch flagcase 0[sys,x0,str,ts]= ...
- 求下列函数的拉普拉斯变换_试求下列函数的拉氏变换.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 ...
- 一些常用函数的拉普拉斯变换
一. 冲激δ(t)\bm{δ(t)}δ(t) 单位冲激信号的傅里叶变换和拉普拉斯变换均为1 二. 冲激序列 三. 阶跃信号 四. 单边指数衰减信号 五. tn\bm{t^n}tn 六. sin(t)和 ...
- matlab resampc函数,基于contourlet变换的红外与可见光图像融合matlab源码
基于contourlet变换的红外与可见光图像融合matlab源码 matlab 2020-12-1 下载地址 https://www.codedown123.com/53619.html 基于con ...
- 沃尔什函数 与 沃尔什-哈达玛变换
图像处理中有许多变换常常选用方波信号或者它的变形. 沃尔什函数是一组矩形波,其取值为1和-1,非常便于计算机运算. 沃尔什函数有三种排列或编号方式,以哈达玛排列最便于快速计算. 采用哈达玛排列的沃尔什 ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- C语言程序设计(常用函数说明)
C语言程序设计(常用函数说明) C 语言是1972年由美国的Dennis Ritchie设计发明的,并首次在UNIX操作系统的 DEC PDP-11计算机上使用.它由早期的编程语言 BCPL(Basi ...
最新文章
- [UT]Unit Test理解
- php中strrpos函数的返回值类型是型_PHP常用函数总结
- linux系统下开机启动流程
- OpenFOAM安装教程(史上最全:OpenFOAM、ParaView、OpenFOAM多版本共存)
- linux上点时间延时,Linux上时间和定时器
- 数据结构之--冒泡排序的三种实现
- java test20006_Java单例7种测试实践
- LeetCode(235)——二叉搜索树的最近公共祖先(JavaScript)
- 微信支付金额为0.01分报错,和少一分钱的解决办法
- Route@简单应用
- 规避VMware虚拟机检测
- 生信自学笔记(三)分子数据库
- 长江大学计算机地质绘图,石文油气藏地质智能绘图系统
- html制作日程安排,如何制作一个Web日程安排表?
- 学计算机应用技术买什么笔记本电脑,大学什么专业用电脑 要不要买电脑
- 这么多年你还在怕正则吗?
- 华为视频会议TE40
- LB10S-ASEMI贴片整流桥LB10S
- bitmap.compress(图片压缩的两种方式)(1,质量压缩;2,采样率压缩)
- 用python整个活(2)——用numpy做一个蜘蛛纸牌
热门文章
- JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用[转载]
- 外推主要发布平台(JM)
- 【转】Linux下的多线程编程背景知识
- 如何安全地迁移到Exchange 2003?
- countif函数比较两列不同_这些Excel函数公式,职场办公天天用,赶紧掌握!
- 1流式细胞术荧光比值计算_流式细胞术技巧攻略!
- 麦吉尔大学 计算机科学和阿尔伯特,阿尔伯特大学怎么样?
- java5错误_Error:java: 错误: 不支持发行版本 5
- JUC阻塞队列BlockingQueue讲解
- 3-31Pytorch与auto-variabletensor