OpenCV中使用EdgeDrawing模块查找圆
从OpenCV4.5.2开始,Contrib模块中封装了开源库ED_Lib用于查找图像中的直线、线段、椭圆和圆。Github地址:
https://github.com/CihanTopal/ED_Lib
算法原理简介:
边缘绘制(ED)算法是一种解决边缘检测问题的主动方法。与许多其他遵循减法方法的现有边缘检测算法相比(即在图像上应用梯度滤波器后,根据多种规则消除像素,例如 Canny 中的非极大值抑制和滞后),ED 算法通过加法策略工作,即逐一选取边缘像素,因此称为“边缘绘制”。然后我们处理这些随机形状的边缘段以提取更高级别的边缘特征,即直线、圆、椭圆等。从阈值梯度幅度中提取边缘像素的流行方法是非极大值抑制,它测试每个像素是否具有最大值沿其梯度方向的梯度响应,如果没有则消除。然而,此方法不检查相邻像素的状态,因此可能会导致低质量(在边缘连续性、平滑度、薄度、定位方面)边缘片段。ED 不是非极大值抑制,而是指向一组边缘像素,并通过最大化边缘段的总梯度响应来将它们连接起来。因此,它可以提取高质量的边缘片段,而不需要额外的滞后步骤。
OpenCV中使用介绍文档:
https://docs.opencv.org/4.9.0/d1/d1c/classcv_1_1ximgproc_1_1EdgeDrawing.html
Python中使用演示:
from __future__ import print_function
import numpy as np
import cv2 as cv
import random as rng
import sysrng.seed(12345)def main():try:fn = sys.argv[1]except IndexError:fn = 'Image1.png'# 读取图像src = cv.imread(cv.samples.findFile(fn))if src is None:print(f"Error: Unable to load image '{fn}'")return# 转换为灰度图像gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# 创建边缘绘制器ed = cv.ximgproc.createEdgeDrawing()# 设置边缘绘制参数EDParams = cv.ximgproc_EdgeDrawing_Params()EDParams.MinPathLength = 50EDParams.PFmode = FalseEDParams.MinLineLength = 20EDParams.NFAValidation = Trueed.setParams(EDParams)# 检测边缘ed.detectEdges(gray)# 获取边缘段、直线和椭圆segments = ed.getSegments()lines = ed.detectLines()ellipses = ed.detectEllipses()# 绘制检测到的边缘段ssrc = src.copy() * 0 # 创建黑色背景图像用于绘制边缘段for i in range(len(segments)):color = (rng.randint(0, 256), rng.randint(0, 256), rng.randint(0, 256))cv.polylines(ssrc, [segments[i]], isClosed=False, color=color, thickness=1, lineType=cv.LINE_8)# 绘制检测到的直线lsrc = src.copy() # 创建原始图像的副本用于绘制直线if lines is not None:lines = np.uint16(np.around(lines))for i in range(len(lines)):cv.line(lsrc, tuple(lines[i][0][0:2]), tuple(lines[i][0][2:4]), (0, 0, 255), 1, cv.LINE_AA)# 绘制检测到的椭圆和圆esrc = src.copy() # 创建原始图像的副本用于绘制椭圆和圆if ellipses is not None:for ellipse in ellipses:center = tuple(map(int, ellipse[0][0:2]))major_axis = int(ellipse[0][2])minor_axis = int(ellipse[0][3]) if ellipse[0][2] != ellipse[0][3] else 0 # 如果长短轴相等,则视为圆,minor_axis设为0angle = ellipse[0][4]color = (0, 0, 255) if minor_axis != 0 else (0, 255, 0) # 非圆用红色,圆用绿色axes = (major_axis // 2, minor_axis // 2) if minor_axis != 0 else (major_axis // 2, major_axis // 2) # 转换为半径cv.ellipse(esrc, center, axes, angle, 0, 360, color, 2, cv.LINE_AA)# 显示图像cv.imshow("Source Image", src)cv.imshow("Detected Edge Segments", ssrc)if lines is not None:cv.imshow("Detected Lines", lsrc)if ellipses is not None:cv.imshow("Detected Ellipses and Circles", esrc)# 等待用户按下任意键cv.waitKey(0)# 清理cv.destroyAllWindows()if __name__ == '__main__':print(__doc__)main()
示例图
相关文章:

OpenCV中使用EdgeDrawing模块查找圆
从OpenCV4.5.2开始,Contrib模块中封装了开源库ED_Lib用于查找图像中的直线、线段、椭圆和圆。Github地址: https://github.com/CihanTopal/ED_Lib 算法原理简介: 边缘绘制(ED)算法是一种解决边缘检测问题的主动方法…...
C++在游戏领域的主要应用
1、C简介 C是一种通用的程序设计语言,其设计就是为了使认真的程序员工作得更愉快。除了一些小细节之外,C是C程序设计语言的一个超集。C提供了C所提供的各种功能还为定义新类型提供了灵活而有效的功能。程序员可以通过定义新类型,使这些类型与…...

基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 赛事信息界面图 赛事通知界面…...
Web Broker(Web服务应用程序)入门教程(2)
1. Web 调度器(Web Dispatcher) 如果您使用的是 Web 模块,它就充当 Web 调度器的角色。如果您使用的是现成的数据模块,则必须向该数据模块中添加一个单一的调度器组件(Web.HTTPApp.TWebDispatcher)。调度器维护着一个动作项集合,这些动作项知道如何处理特定类型的请求消息…...

redis:list列表命令和内部编码
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令LPUSH 和 LPUSHXLRANGERPUSH 和 RPUSHXLPOP 和 RPOPLINDEXLINSERTLLENLREMLTRIMLSET阻塞版命令BLPOP 和 BRPOP 内部编码总结 前言 列…...
.Net Core Configuration用法
//在应用程序的任何地方注入 IConfiguration 来访问配置数据。ASP.NET Core 默认会加载 appsettings.json 文件 IConfiguration _configuration builder.Configuration; string connectionString _configuration["ConnectionStrings:SqlServerConnection"]; Hel…...

分享一些企业选择管理顾问公司的成功经验
为了在激烈的市场竞争中脱颖而出,许多企业开始寻求外部专业力量的支持,其中,企业管理顾问公司以其专业的知识、丰富的经验和独到的见解,成为了众多企业的得力助手。本文将分享一些企业在选择企业管理顾问公司过程中的成功经验&…...

「Qt Widget中文示例指南」如何实现窗口嵌入?
Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文中的示例主要演…...

企业CRM选型必看:2024年最佳CRM系统排行
企业用户在选择CRM系统时,不仅要考虑系统的功能性、可定制性,还要考虑其与现有工具的集成能力以及价格。此外,在2024年,越来越多的企业用户会把CRM厂商的AI能力列入考察范畴。 本文分析整理2024年最佳CRM系统排行榜,从…...

SQL入门的基础知识
思考 无论是干任何语言或者其他方向的开发,都会和我们的SQL去进行打交道 总结 学习SQL的原因:后面的实战案例需要用SQL,SQL是开发人员的必备技能 现在只需要学到满足后续案例需要,即简单增删改查,做一个入门即可 1.…...

JS渗透(安全)
JS逆向 基本了解 作用域: 相关数据值 调用堆栈: 由下到上就是代码的执行顺序 常见分析调试流程: 1、代码全局搜索 2、文件流程断点 3、代码标签断点 4、XHR提交断点 某通js逆向结合burp插件jsEncrypter 申通快递会员中心-登录 查看登录包…...

淘宝扭蛋机小程序,功能优势分析
随着潮玩文化的影响,扭蛋机作为潮玩的鼻祖,又再次成为了大众的“宠儿”。扭蛋机通过与多种IP结合,创造出各种元素的商品,为大众带来娱乐、收藏的新方式。我国潮玩市场规模正在大幅度的增长,将达到千亿元,发…...
Redis 数据备份与恢复
Redis 数据备份与恢复 引言 Redis 作为一种高性能的键值存储数据库,在许多应用场景中扮演着重要的角色。然而,数据的安全性是任何数据库系统都需要关注的问题。为了确保数据的安全和完整性,定期进行数据备份和掌握恢复策略是至关重要的。本文将详细介绍 Redis 数据备份与恢…...
CentOS9 Stream 设置禁用IPV6
CentOS9 Stream 设置禁用IPV6 方法 1: 修改 sysctl 配置方法 2: 使用 NetworkManager方法 3: 禁用内核参数验证 IPv6 是否禁用 在 CentOS 9 Stream 中,您可以通过以下步骤禁用 IPv6: 方法 1: 修改 sysctl 配置 编辑 sysctl 配置文件: 打开 /…...

C语言 | Leetcode C语言题解之第530题二叉搜索树的最小绝对差
题目: 题解: void dfs(struct TreeNode* root, int* pre, int* ans) {if (root NULL) {return;}dfs(root->left, pre, ans);if (*pre -1) {*pre root->val;} else {*ans fmin(*ans, root->val - (*pre));*pre root->val;}dfs(root->…...
【系统设计】高效的分布式系统:使用 Spring Boot 和 Kafka 实现 Saga 模式
在现代分布式系统中,管理跨多个服务的长事务至关重要。传统的分布式事务解决方案往往面临性能瓶颈和复杂性问题,而 Saga 模式 作为一种灵活高效的解决方案,逐渐受到开发者的青睐。本文将探讨如何利用 Spring Boot 和 Kafka 实现 Saga 模式&am…...
蓝桥杯 python day01 第一题
1. 确定字符串是否包含唯一字符 确定字符串是否包含唯一字符 题目描述 实现一个算法来识别一个字符串的字符是否是唯一的(忽略字母大小写)。 若唯一,则输出YES,否则输出NO。 输入描述 输入一行字符串,长度不超过…...

10款好用的win10录屏软件带你体验专业录屏。
其实win10系统的设备上有自带的录屏功能,还有powerpoint里面也有录屏工具可以使用。如果有朋友觉得里面的功能并不能够满足自己的录屏需求的话,可以用专门的录屏软件来完成。比如我最近找到的这4款工具,录制的视频效果好,操作还方…...

2025浙江省考报名流程详细教程
2025年浙江省考报名马上就要开始了,有想要参加浙江省考的同学,可以提前看一下报名流程,和报名照要求。 报名时间:11月6日9时一11月11日17时 南核时间:11月6日9时一11月13日17时 缴费时间:11月14日9时一11月…...
unity3d——关于GetComponent<T>()
先看代码: TankBaseObj obj other.GetComponent<TankBaseObj>();if(obj ! null){//说明是坦克打到坦克 受伤处理 固定不会受伤 移动的会受伤obj.Wound(fatherObj);} TankBaseObj 是一个基类 wound是一个虚函数 子类已经重新实现 当你的游戏对象依附…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...