当前位置: 首页 > news >正文

OpenCV中的轮廓检测cv2.findContours()

文章目录

  • 前言
  • 一、查找轮廓
  • 二、绘制轮廓
  • 轮廓面积
  • 轮廓周长


前言

轮廓提取的前提,将背景置为黑色,目标为白色(利用二值化或Canny)

边缘检测,例如Canny等,利用梯度变化,记录图像中的边缘像素点,返回和源图片一样尺寸和类型的边缘图。

轮廓检测,则是将得到的每一个轮廓信息存储下来,记录的是轮廓之间和内部的信息。


一、查找轮廓

contours, hierarchy = cv2.findContours(image, mode, method)

参数

  • Image:输入的二值图像,用于检测轮廓

mode:轮廓检索模式,决定函数如何检索和返回轮廓。

  • cv2.RETR_EXTERNAL:只检索最外层的轮廓。忽略轮廓内部的任何嵌套轮廓。
  • cv2.RETR_LIST:检索所有轮廓,但不建立轮廓之间的父子关系。所有的轮廓都被放置在同一个列表中,但彼此之间没有层级结构。
  • cv2.RETR_CCOMP:检索所有轮廓,并建立两层轮廓间的父子关系。外层轮廓是物体的外边界,内层轮廓是物体的内孔边界。如果内孔内还有另一个连通物体,这个物体的边界也会被检索出来,并作为外层的子轮廓。
  • cv2.RETR_TREE:检索所有轮廓,并建立完整的轮廓层级结构。这种模式下,轮廓之间的父子关系被完整地保存下来,形成一个树状结构。

method:轮廓近似方法,决定轮廓如何被表示和存储。不同的近似方法会影响轮廓的精度和所需的存储空间。

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。这是最高精度的表示方法,但会占用较多的存储空间。
  • cv2.CHAIN_APPROX_SIMPLE:仅存储轮廓的端点。这种方法会压缩水平方向、垂直方向和对角线方向上的轮廓点,只保留端点。例如,一个矩形轮廓只需存储四个角点即可。
    返回值
  • contours:一个 Python 列表,其中包含了图像中所有的轮廓。每个轮廓都是一个点集(NumPy 数组),表示轮廓上的所有点。
  • hierarchy:一个 NumPy 数组,包含了轮廓的层次结构信息。对于每个轮廓,它包含了四个值:[Next, Previous, First Child, Parent]。这个数组对于理解轮廓之间的关系非常有用。

二、绘制轮廓

mage = cv2.drawContours(image, contours, contourIdx, color, thickness)
img = cv2.drawContours(img, contours, -1, (0, 255, 0), 2)

参数

  • image:目标图像,轮廓将被绘制在这个图像上。
  • contours:要绘制的所有轮廓。
  • contourIdx:指定要绘制的轮廓索引。如果是 -1,则绘制所有轮廓。
  • color:轮廓的颜色。
  • thickness:轮廓线的厚度。

轮廓面积

cv2.contourArea(contour, oriented)
area = cv2.contourArea(contours[0])
  • contour:这是一个轮廓的点集,通常通过 cv2.findContours() 函数获得。它是一个 NumPy 数组,其中包含了轮廓上所有点的坐标。
  • oriented(可选):这是一个布尔值参数。如果提供了这个参数,并且其值为 True,则函数返回的面积值将带有方向性,正数表示轮廓是逆时针方向,负数表示轮廓是顺时针方向。如果未提供此参数或参数值为 False(默认值),则函数返回的面积值为绝对值,即不考虑轮廓的方向。

轮廓周长

cv2.arcLength(curve, closed)
length = cv2.arcLength(contours[0], True)
  • curve:轮廓的点集,通过 cv2.findContours() 函数获得。是一个 NumPy 数组,其中包含了轮廓上所有点的坐标。
  • closed:布尔值参数,用于指定轮廓是否是闭合的。如果轮廓是闭合的(例如,一个完整的圆或正方形),则将此参数设置为 True。如果轮廓不是闭合的(例如,一条线段或圆弧的一部分),则将此参数设置为 False。

相关文章:

OpenCV中的轮廓检测cv2.findContours()

文章目录 前言一、查找轮廓二、绘制轮廓轮廓面积轮廓周长 前言 轮廓提取的前提,将背景置为黑色,目标为白色(利用二值化或Canny) 边缘检测,例如Canny等,利用梯度变化,记录图像中的边缘像素点&a…...

JFlash读取和烧录加密stm32程序

JFlash读取和烧录加密stm32程序 安装后JFlash所在的目录:C:\Program Files\SEGGER\JLink 一、烧写加密程序 1、打开C:\Program Files\SEGGER\JLink目录,找到JFlash.exe,双击它,就可以打开该执行程序。见下图: 2、选择“Create …...

【总结】实际业务场景中锁、事务、异常如何考虑使用?

文章目录 锁处理目的:考虑锁控制思路:生命周期接口并发控制解决方案:测试锁是否生效:模拟多线程并发场景的2种方式: 事务处理目的:考虑事务控制思路:解决方案: 总结 锁处理 目的&am…...

Pytorch使用Dataset加载数据

1、前言: 在阅读之前,需要配置好对应pytorch版本。 对于一般学习,使用cpu版本的即可。参考教程点我 导入pytorch包,使用如下命令即可。 import torch # 注意虽然叫pytorch,但是在引用时是引用torch2、神经网络获取…...

【nginx】nginx的优点

目录 一、高性能1.1 高并发处理1.2 低内存消耗1.3 快速响应 二、高扩展性2.1 模块化设计2.2 动态模块扩展 三、高可靠性3.1 核心框架稳定3.2 进程管理3.3 负载均衡与健康检查3.4 热部署 四、功能丰富4.1 反向代理4.2 HTTP缓存4.3 安全功能 五、易于配置和管理5.1 配置文件简单5…...

K8S ingress 初体验 - ingress-ngnix 的安装与使用

准备环境 先把 google 的vm 跑起来… gatemanMoreFine-S500:~/projects/coding/k8s-s/service-case/cloud-user$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 124d v1.23.6 k8s-no…...

qt 获取父控件

在 Qt 中,你可以通过调用 QWidget 的 parentWidget() 方法来获取一个控件的父控件。这个方法会返回一个指向父控件的指针,如果该控件没有父控件,则返回 nullptr。 以下是一个简单的示例,展示了如何获取一个按钮的父控件&#xff…...

flask基础配置详情

前言 一个简单的应用 app Flask(__name__) app.route("/") def hello_world():return "<p>Hello,World!"运行Flask应用 #flask命令运行flask --app hello run#使用Python命令进行运行python -m flask # 作为一个捷径&#xff0c;如果文件名为 app…...

单相整流-TI视频课笔记

目录 1、单相半波整流 1.1、单相半波----电容滤波---超轻负载 1.2、单相半波----电容滤波---轻负载 1.3、单相半波----电容滤波---重负载 2、全波整流 2.1、全波整流的仿真 2.2、半波与全波滤波的对比 3、全桥整流电路 3.1、全波和全桥整流对比 3.2、半波全波和全桥…...

用GPT 4o提高效率

**GPT-4o可以通过提高编程效率、优化工作流程、增强文档管理和知识分享等多方面帮助用户提升工作效率**。具体如下&#xff1a; 1. **代码生成与优化** - **快速原型开发**&#xff1a;程序员可以通过向GPT-4o描述需求或功能来生成初步的代码框架或关键函数&#xff0c;从而节省…...

20240711每日消息队列-------------MQ消息的积压的折磨

目标 解决MQ消息的积压 背景 菜馆系统----------- 系统读取消息&#xff0c;处理业务逻辑&#xff0c;持久化订单和菜品数据&#xff0c;然后将其显示在菜品管理客户端上。 最初我们的用户基数很小&#xff0c;上线后的一段时间内&#xff0c;MQ消息通信还算顺利。 随着用户…...

推荐一个比 Jenkins 使用更简单的项目构建和部署工具

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 项目介绍 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解…...

java 在pdf中根据关键字位置插入图片(公章、签名等)

java 在pdf中根据关键字位置插入图片&#xff08;公章、签名等&#xff09; 1.使用依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.12</version><type>pom</type>…...

施耐德EOCR系列电机保护器全面升级后無端子型

一、施耐德数码型产品升级背景 施耐德电气作为一家全球领先的能源管理和自动化解决方案提供商&#xff0c;其产品线包括各种电动机保护器等数码型产品。随着技术的不断发展和市场需求的变化&#xff0c;施耐德会对其产品进行定期升级和优化。在升级过程中&#xff0c;产品的设…...

27.数码管的驱动,使用74HC595移位寄存器芯片

PS&#xff1a;升腾A7pro系列FPGA没有数码管外设&#xff0c;因此以AC620FPGA为例展开实验。 &#xff08;1&#xff09;共阳极数码管和共阴极数码管示意图&#xff1a; AC620中的数码管属于共阳极数码管&#xff0c;段选端口(dp,g,f,e,d,c,b,a)低电平即可点亮led。人眼的视觉…...

TCP/IP 原理、实现方式与优缺点

TCP/IP&#xff08;传输控制协议/网际协议&#xff09; 是互联网的核心协议套件&#xff0c;主要用于在不同计算机之间进行通信。它包括多个层次的协议&#xff0c;每层协议负责不同的功能。TCP/IP 的四个层次模型如下&#xff1a; 网络接口层&#xff1a;负责在特定的物理网络…...

利率债与信用债的区别及其与债券型基金的关系

利率债与信用债的定义及其区别 定义 利率债&#xff1a; 定义&#xff1a;利率债是指由主权或类主权主体&#xff08;如中华人民共和国财政部、国家开发银行等&#xff09;发行的债券。这些债券通常被认为没有信用风险&#xff0c;因为它们由国家信用背书。特点&#xff1a;由…...

linux下解压命令

在Linux下&#xff0c;解压缩文件通常涉及多种命令&#xff0c;具体取决于文件的压缩格式。以下是一些常用的解压缩命令&#xff1a; tar.gz / .tgz 如果文件扩展名为 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令来解压缩&#xff1a; tar -xzf filename.tar.gz这里的 -x …...

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…...

Swift入门笔记

Swift入门笔记 简单值控制流函数和闭包对象和类枚举和结构体并发协议和扩展错误处理泛型 简单值 // 声明变量 var myVariable 42 myVariable 50// 声明常量 let myConstant 42// 声明类型 let implicitInteger 70 let implicitDouble 70.0 let explicitDouble: Double 7…...

2025届学术党必备的AI辅助论文网站实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 旨在辅助学术论文撰写的人工智能写作工具DeepSeek&#xff0c;能通过让用户明确研究主题&…...

Qwen3.5-9B量子计算辅助:算法描述理解+Qiskit代码生成+实验设计建议

Qwen3.5-9B量子计算辅助&#xff1a;算法描述理解Qiskit代码生成实验设计建议 1. 项目概述与核心能力 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;在量子计算领域展现出强大的辅助能力。该模型特别适合用于&#xff1a; 算法描述理解&#xff1a;解析复杂的量…...

Wan2.2-TI2V-5B:消费级GPU上的720P视频生成革命

Wan2.2-TI2V-5B&#xff1a;消费级GPU上的720P视频生成革命 【免费下载链接】Wan2.2-TI2V-5B Wan2.2-TI2V-5B是一款开源的先进视频生成模型&#xff0c;基于创新的混合专家架构&#xff08;MoE&#xff09;设计&#xff0c;显著提升了视频生成的质量与效率。该模型支持文本生成…...

专业术语统计报告_分布式能源系统源储荷耦合特性及主动调控运行策略研究

专业术语统计报告_分布式能源系统源储荷耦合特性及主动调控运行策略研究 一、概要简析 【概要分析】 本文档《分布式能源系统源储荷耦合特性及主动调控运行策略研究》超用心地围绕研究主题展开了系统性探讨哦&#x1f61c;&#xff01;文档总字符数足足有250531&#xff0c;其中…...

别再死记硬背U-Net结构了!用PyTorch手撸一个,从代码反推设计思想

从零实现U-Net&#xff1a;用PyTorch代码拆解医学图像分割的核心设计 在医学影像分析领域&#xff0c;U-Net以其独特的对称结构和跳跃连接机制&#xff0c;成为细胞分割、肿瘤检测等任务的黄金标准。但很多开发者即便看过网络结构图&#xff0c;在实际编码时仍会困惑&#xff1…...

IntelliJ IDEA 2019安装教程及下载

软件介绍&#xff1a; IntelliJ IDEA 是捷克 JetBrains 公司研发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主打 Java 和 Kotlin 开发&#xff0c;被誉为 “最佳 Java IDE”&#xff0c;适配不同层级开发者需求&#xff1b;它具备智能代码补全、静态分析、一键重…...

Zotero文献去重终极解决方案:从混乱到有序的智能管理指南

Zotero文献去重终极解决方案&#xff1a;从混乱到有序的智能管理指南 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 如何解决文献库重复危机&…...

DeepSeek-R1蒸馏模型入门:1.5B版本本地部署完整教程

DeepSeek-R1蒸馏模型入门&#xff1a;1.5B版本本地部署完整教程 1. 引言 1.1 为什么选择DeepSeek-R1 1.5B版本 DeepSeek-R1 1.5B版本是专为本地CPU环境优化的轻量级推理模型&#xff0c;它通过知识蒸馏技术保留了原版70B参数模型的核心推理能力&#xff0c;同时将参数量压缩…...

用两块74LS153芯片在Quartus II里搭个8选1数据选择器,附仿真波形图

用两块74LS153芯片在Quartus II里实现8选1数据选择器的图形化设计 数字电路实验中&#xff0c;数据选择器是最基础也最实用的组合逻辑器件之一。对于刚接触Quartus II原理图设计的新手来说&#xff0c;用图形化方式搭建电路不仅能避开HDL编码的复杂性&#xff0c;还能直观理解芯…...

【NOIP】1999真题解析 luogu-P1014 Cantor 表 | GESP三、四级以上可练习

NOIP 1999 普及组真题&#xff0c;主要考察简单的二维矩阵模拟与通过寻找数学规律进行时间复杂度优化。可以用模拟法暴力求解&#xff0c;也能通过总结对角线的排列规律实现高效求解。GESP三、四级以上可练习。题目难度⭐⭐☆☆☆&#xff0c;洛谷难度等级普及−。 luogu-P101…...