OpenCV C++霍夫圆查找
OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform),它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间,来确定哪些像素符合圆形状。
1. 霍夫变换的原理
霍夫变换的基本思想是将图像空间中的点映射到一个参数空间,在这个参数空间中可以检测特定的几何形状(如直线、圆等)。对于圆形,霍夫变换的目标是找到符合圆方程的像素。
圆的方程
在二维平面上,圆可以由以下方程描述:
其中:
- (a, b) 是圆心坐标;
- r 是圆的半径;
- (x, y) 是圆周上的一个点。
2. 霍夫圆检测的步骤
2.1 边缘检测
- 在进行霍夫变换之前,首先对图像执行边缘检测,通常使用 Canny 边缘检测器。边缘检测的目的是找到图像中的边缘像素,因为这些像素更有可能属于圆周。
2.2 参数空间的投票
-
每一个在边缘图像中的像素点 (x, y),它可能属于多个不同圆的边界,因此需要通过以下步骤将其投票映射到参数空间:
- 将每个边缘像素映射为一组可能的圆心 (a, b),这些圆心位于距离该像素 r 的位置。通过改变半径 r ,该像素 (x, y) 将投票给不同半径下的多个圆心。
- 对于每个可能的半径 r ,根据圆方程:
其中 θ 是不同的角度值(从 0 到 360 度),遍历这些角度得到可能的圆心 (a, b)。
-
每个像素点对不同半径 r 和不同圆心 (a, b) 进行投票,记录这些投票结果。
2.3 累加器
- 在参数空间 (a, b, r) 中有一个累加器,用来统计哪些 (a, b, r) 的组合收到了最多的投票。最多投票的点表示在边缘图像中最可能的圆心和半径。
- 累加器的最大值对应的是检测到的圆。
2.4 圆的确定
- 最后,累加器中投票结果最多的那些 (a, b, r) 组合将被认为是图像中检测到的圆形。霍夫圆检测可以输出这些圆的圆心坐标 (a, b) 以及半径 r。
3. OpenCV 中霍夫圆检测的实现
OpenCV 中使用 HoughCircles()
函数来进行霍夫圆检测,其主要参数包括:
image
:输入的边缘检测图像(通常是经过边缘检测或灰度化的图像)。method
:霍夫变换的检测方法,通常为HOUGH_GRADIENT
,这是经典的霍夫圆检测方法。dp
:累加器分辨率的倒数。dp=1
表示累加器的分辨率与输入图像相同;dp=2
表示累加器分辨率是输入图像的一半。minDist
:检测到的圆之间的最小距离,防止检测到多个重叠的圆。param1
:用于边缘检测的 Canny 边缘检测的阈值。param2
:累加器的阈值,值越高检测到的圆越少,越准确。minRadius
和maxRadius
:定义圆的最小和最大半径范围。
#include <opencv2/opencv.hpp>
//#include "quickopencv.h"
#include <iostream>
#include <math.h>
#include <opencv2/imgproc.hpp>
#include <vector>using namespace cv;
using namespace std;int main(int argc, char** argv) {Mat img = imread("path_to_img.jpg");//QuickDemo qd;//qd.hough_circle(img);resize(img, img, Size(img.cols, img.rows), 0, 0, INTER_LINEAR);imshow("img", img);if (img.empty()) {cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat gary;//将图像转换为灰度图cvtColor(img, gary, COLOR_BGR2GRAY);//高斯模糊//GaussianBlur(输入图像,输出图像,高斯核,X轴上的标准差,Y轴上的标准差);GaussianBlur(gary, gary, Size(9, 9), 2, 2);// 转换为二值图/*Mat binary;threshold(img, binary, 100, 255, cv::THRESH_BINARY);imshow("binary", binary);*///检测圆形vector<Vec3f> circles;double dp = 1; //累加器分辨率与图像分辨率的反比,如果dp=1,则累加器具有与输入图像相同的分辨率。如果dp=2,累加器的宽度和高度都是原来的一半。double minDist = 10; //两个圆心的最小距离double param1 = 40; //Canny边缘检测的较大阈值double param2 = 40; //累加器阈值int min_radius = 1; //圆形半径最小值int max_radius = 50; //圆形半径最大值HoughCircles(gary, circles, HOUGH_GRADIENT, dp, minDist, param1, param2, min_radius, max_radius);//在图像中标记出圆形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]);//绘制圆心circle(img, center, 3, Scalar(0, 255, 0), -1, 8, 0);// 设置圆心坐标的文本std::string centerText = "(" + std::to_string(center.x) + "," + std::to_string(center.y) + ")";// 计算文本框的大小cv::Size textSize = cv::getTextSize(centerText, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, nullptr);// 计算文本框的左下角位置,使其在圆心附近cv::Point textOrg((center.x - textSize.width / 2), (center.y + textSize.height / 2));// 在圆心处绘制文本cv::putText(img, centerText, textOrg, cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255), 1);//绘制圆circle(img, center, radius, Scala
4. 霍夫圆检测的应用场景
霍夫圆检测广泛应用于多个场景,包括但不限于:
- 车轮、硬币等圆形物体检测;
- 医学图像中细胞、眼球、病变区域的圆形检测;
- 机器视觉中的工业零件检测。
相关文章:
OpenCV C++霍夫圆查找
OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform),它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间,来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…...
H.264编解码介绍
一、简介 H.264,又称为AVC(Advanced Video Coding),是一种广泛使用的视频压缩标准。它由国际电信联盟(ITU)和国际标准化组织(ISO)联合开发,并于2003年发布。 H.264的发展历史可以追溯到上个世纪90年代。当时,视频压缩技术的主要标准是MPEG-2,但它在压缩率和视频质…...
Java | Leetcode Java题解之第450题删除二叉搜索树中的节点
题目: 题解: class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…...
【CViT】Deepfake Video Detection Using Convolutional Vision Transformer
文章目录 Deepfake Video Detection Using Convolutional Vision Transformerkey points**卷积视觉变压器**FLViT实验总结Deepfake Video Detection Using Convolutional Vision Transformer 会议/期刊:2021 作者: key points 提出了一种用于检测深度伪造的卷积视觉变压器…...
安卓主板_MTK4G/5G音视频记录仪整机及方案定制
音视频记录仪方案,采用联发科MT6877平台八核2* A78 6* A55主频高达2.4GHz, 具有高能低耗特性,搭载Android 12.0智能操作系统,可选4GB32GB/6GB128GB内存,运行流畅。主板集成NFC、双摄像头、防抖以及多种无线数据连接,支…...
Qt 教程全集目录公布(方便查阅)
点击上方"蓝字"关注我们 Qt 安装 以下是常见安装方法和软件获取 Qt4Qt5Qt6版本下载(在线和离线)【网址】...
云计算SLA响应时间的matlab模拟与仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 用matlab模拟,一个排队理论。输入一堆包,经过buffer(一个或者几个都行)传给server,这些包会在buffer里…...
ARTS Week 42
Algorithm 本周的算法题为 2283. 判断一个数的数字计数是否等于数位的值 给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。 如果对于 每个 0 < i < n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true …...
10.2学习
1.IOC控制反转 IoC(Inverse of Control:控制反转)是⼀种设计思想,就是将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 IoC 容器是 Spring⽤来实现 IoC …...
【数一线性代数】021入门
Index 推荐阅读:https://blog.csdn.net/weixin_60702024/article/details/141729949分析实现总结 推荐阅读:https://blog.csdn.net/weixin_60702024/article/details/141729949 给定二叉树的根节点root,计算其叶节点的个数。 分析实现 类似…...
(k8s)kubernetes中ConfigMap和Secret
转载:ConfigMap 一、ConfigMap介绍 ConfigMap是一种API对象,用来将非机密性的数据保存到键值对中。使用时,Pod可以将其用作环境变量、命令行参数或存储卷中的配置文件。 ConfigMap将你的环境配置信息和容器镜像解耦,便于应用配置…...
stm32四足机器人(标准库)
项目技术要求 PWM波形的学习 参考文章stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客 舵机的学习 参考文章 stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)…...
基于Hive和Hadoop的共享单车分析系统
本项目是一个基于大数据技术的共享单车分析系统,旨在为用户提供全面的单车使用信息和深入的出行行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 S…...
基于SSM和vue的机票订购管理系统
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM和vue的机票订购管理系统2拥有两种角色 管理员:用户管理、机票管理、订票管理、公告管理、广告管理、系统管理、添加机票等 用户:登录注册、订票、查看公…...
【rCore OS 开源操作系统】Rust 练习题题解: Enums
【rCore OS 开源操作系统】Rust 练习题题解: Enums 摘要 rCore OS 开源操作系统训练营学习中的代码练习部分。 在此记录下自己学习过程中的产物,以便于日后更有“收获感”。 后续还会继续完成其他章节的练习题题解。 正文 enums1 题目 // enums1.rs // // No hi…...
VPN简述
文章目录 VPNVPN基础VPN类型 VPN VPN隧道安全 VPN基础 背景: 在网络传输中,绝大部分数据内容都是明文传输,存在很多安全隐患(窃听、篡改、冒充) 总部、分公司、办事处、出差人员、合作单位等需要访问总部网络资源 Vi…...
【Kubernetes】常见面试题汇总(四十九)
目录 110.假设一家公司希望通过采用新技术来优化其工作负载的分配。公司如何有效地实现这种资源分配? 111.考虑一家拼车公司希望通过同时扩展其平台来增加服务器数量。您认为公司将如何处理服务器及其安装? 特别说明: 题目 1-68 属于【…...
常见排序算法以及冒泡排序的基础使用方法
众所周知,冒泡排序是编程中最经典也是最简单的一种排序方法,它是通过重复访问对两个相邻的值进行比较,由于在互换的过程中,最大 (或最小) 的那个值会慢慢的交换到顶部,像汽水一样,故名“冒泡排序”。 let a…...
【网络安全】Cookie与ID未强绑定导致账户接管
未经许可,不得转载。 文章目录 前言正文前言 DigiLocker 是一项在线服务,旨在为公民提供一个安全的数字平台,用于存储和访问重要的文档,如 Aadhaar 卡、PAN 卡和成绩单等。DigiLocker 通过多因素身份验证(MFA)来保护用户账户安全,通常包括 6 位数的安全 PIN 和一次性密…...
Ansible Playbook原理与实践(Principles and Practice of Ansible Playbook)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
解决OpenCV保存视频 视频全部为绿色的bug
目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 使用OpenCV-Python 保存视频,视频为numpy array格式,保存的视频全部为无意义的绿色。 问题描述 用opencv 保存的视频会出现全部为绿色的情况&…...
手机使用指南:如何在没有备份的情况下从 Android 设备恢复已删除的联系人
在本指南中,您将了解如何从 Android 手机内存中恢复已删除的联系人。Android 诞生、见证并征服了 80% 的智能手机行业。有些人可能将此称为“非常大胆的宣言”,但最近的统计数据完全支持我们的说法。灵活性、高度改进的可用性和快速性是 Android 操作系统…...
TS系列(6):函数
你好,我是沐爸,欢迎点赞、收藏、评论和关注。 TS系列(1):TS是什么?如何使用? TS系列(2):类型声明、类型推断和类型总览 TS系列(3)&…...
网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?
近年来,信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代,目前信创国产化替代还多发生在操作系统和应用层面,软件工具等目前还在下一阶段规划,但很多企业未雨绸缪,已经在做调研和尝试。 FTP作为世…...
Python操作MongoDB
一、Python链接MongoDB 1、安装pymongo包 使用包管理器安装 pip3 insatll pymongo 2、连接MongoDB 首先需要导入pymongo包: from pymongo import MongoClient 创建MongoClient对象: from pymongo import MongoClient #创建MongoClient对象&#…...
Redis --- 第二讲 --- 特性和安装
一、背景知识 Redis特性: Redis是一个在内存中存储数据的中间件,用于作为数据库,作为缓存,在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据,通过一系列的数据结构。MySQL主要是通…...
基于单片机的两轮直立平衡车的设计
本设计基于单片机设计的两轮自平衡小车,其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器,采用6轴姿态传感器MPU6050测量小车倾角,采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…...
828华为云征文|部署个人知识管理系统 SiyuanNote
828华为云征文|部署个人知识管理系统 SiyuanNote 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 SiyuanNote3.1 SiyuanNote 介绍3.2 SiyuanNote 部署3.3 Siyua…...
MATLAB中pcg函数用法
目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 pcg 提供初始估计值 使用函数句柄代替数值矩阵 pcg函数的功能是求解线性系统 - 预条件共轭梯度法。 语法 x pcg(A,b) x pcg(A,b,tol) x pcg(A,b,tol,maxit) x pcg(A,b,tol,maxit,M) x pcg(A,b,tol,ma…...
Veritus netbackup 管理控制台无法连接:未知错误
节假日停电,netbackup服务器意外停机后重新开机,使用netbackup管理控制台无法连接,提示未知错误。 ssh连接到服务器,操作系统正常,那应该是应用有问题,先试一下重启服务器看看。重新正常关机,重…...
谷歌seo网站怎么做产品分类/信息流广告投放工作内容
FastReport .Net是适用于Windows Forms,ASP.NET,MVC和.NET Core的全功能报表解决方案。它可以在Microsoft Visual Studio 2005-2019中使用。支持.Net Framework 2.0-4.x,.NET Core 3.0及以上版本。 近日,FastReport .Net更新至v2…...
做个网站多少钱找谁做/360关键词指数查询
目录 1.邻接矩阵(adjacency matrix) 2.无向图的邻接矩阵表示 3.有向图的邻接矩阵表示 4.网的邻接矩阵表示 5.示例源代码 1.邻接矩阵(adjacency matrix) (1)用一维数组存储顶点信息 (2&am…...
宝鸡做宝鸡做网站网站/江苏企业网站建设
PythonOpenCV十行代码实现简单的人脸检测 环境安装 OpenCV-python pip安装 pip install opencv-python更换成阿里云镜像源可以更快 pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/GitHub下载OpenCV级联分类器 OpenCV 或者用git clone git clone gi…...
河北网站建设企业/seo整站优化外包公司
经典区间DP:最大m段和 “最大连续和问题”是最大m段和问题的一个特例,其实是当m1的一种特殊情况。 OJ题目:http://acm.nyist.net/JudgeOnline/problem.php?pid742 #include <iostream> #include <cstdio> #define INF 0x3f3f3f3…...
wordpress验证登录页面/百度文库首页官网
我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己的一份文档. 字典的定义 赋值 func demo() {//oc定义字典使用 {}//swift中使用 []// [KEY: VALUE] -> [String: NSObject]let dict ["name": "老张",…...
保定行业网站/百度非企推广开户
1.安装 1.1安装mmseg ./bootstrap # 必须执行,不然安装会失败 ./configure --prefix/usr/local/mmseg-3.2.14 #指定安装目录 make make install 1.2安装coreseek # 在csft-4.1/configure.ac中 # 查找 AM_INIT_AUTOMAKE([-Wall -Werror foreign]) # 更改 AM_INIT_AUT…...