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

别再被hierarchy搞晕了!OpenCV cv2.findContours四种模式(RETR_*)保姆级图解指南

OpenCV轮廓检测全解析四种层级模式与实战图解轮廓检测是计算机视觉中最基础也最强大的工具之一但很多开发者在面对cv2.findContours的层级参数时常常感到困惑。本文将用直观的可视化方式带你彻底理解RETR_EXTERNAL、RETR_LIST、RETR_CCOMP和RETR_TREE四种模式的区别与应用场景。1. 轮廓检测基础概念在深入四种模式之前我们需要明确几个核心概念。轮廓(Contour)本质上是一系列相连的点这些点构成了物体的边界。在OpenCV中cv2.findContours函数能够从二值图像中提取这些轮廓。一个典型的轮廓检测代码如下import cv2 # 读取并预处理图像 image cv2.imread(example.jpg) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, binary cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 轮廓检测 contours, hierarchy cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)这里有几个关键点需要注意输入图像必须是单通道二值图像黑白图像输出包含两个主要部分轮廓列表和层级信息方法参数(CHAIN_APPROX_*)决定了轮廓点的存储方式2. 层级(hierarchy)数据结构详解层级信息是一个NumPy数组它描述了轮廓之间的相互关系。每个轮廓对应的层级信息包含4个值[下一个轮廓索引, 前一个轮廓索引, 第一个子轮廓索引, 父轮廓索引]这些索引值遵循以下规则索引从0开始对应contours列表中的位置如果不存在对应关系则值为-1轮廓的兄弟关系通过前后索引连接父子关系通过子索引和父索引建立为了更好地理解我们来看一个简单的例子。假设检测到以下轮廓轮廓0: [1, -1, -1, -1] # 第一个轮廓没有前驱和父轮廓 轮廓1: [2, 0, -1, -1] # 前一个是0下一个是2 轮廓2: [-1, 1, -1, -1] # 最后一个轮廓前一个是1这表示三个轮廓是平级关系像链条一样连接在一起。3. 四种检索模式深度解析3.1 RETR_EXTERNAL只检测最外层轮廓这是最简单的一种模式它只返回图像中最外层的轮廓忽略所有内部轮廓。这种模式特别适合当你只关心物体外部形状时使用。特点所有检测到的轮廓都是顶级轮廓没有父轮廓hierarchy中所有轮廓的[2]和[3]位置都是-1没有子轮廓和父轮廓执行速度最快内存占用最少contours, hierarchy cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)适用场景文档扫描边缘检测物体外部形状分析快速初步筛选提示当处理复杂图像时RETR_EXTERNAL可以显著减少需要处理的轮廓数量提高处理效率。3.2 RETR_LIST检测所有轮廓但不建立层级RETR_LIST模式会返回图像中的所有轮廓但不建立任何层级关系。所有轮廓都是平级的就像在一个简单的列表中。特点检测所有轮廓无论嵌套深度不建立父子关系hierarchy中所有轮廓的[2]和[3]位置都是-1比RETR_EXTERNAL慢但比建立完整层级的模式快contours, hierarchy cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)层级表示例轮廓0: [1, -1, -1, -1] 轮廓1: [2, 0, -1, -1] 轮廓2: [3, 1, -1, -1] 轮廓3: [-1, 2, -1, -1]适用场景需要所有轮廓但不关心嵌套关系轮廓统计分析当层级信息不重要时的通用选择3.3 RETR_CCOMP两层级轮廓结构RETR_CCOMP模式建立了一个两层的轮廓层级结构。物体的外轮廓属于第一层内轮廓洞属于第二层。如果一个洞内有其他物体则该物体轮廓又属于第一层。特点建立了两层结构外轮廓和内轮廓洞同一层级内的轮廓可能有兄弟关系比RETR_LIST慢但比RETR_TREE快contours, hierarchy cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)典型层级关系外轮廓0: [2, -1, 1, -1] 内轮廓1: [-1, -1, -1, 0] # 父轮廓是0 外轮廓2: [-1, 0, 3, -1] 内轮廓3: [-1, -1, -1, 2] # 父轮廓是2适用场景需要区分物体和物体上的洞票据识别外框和内部文字区域简单物体与背景分离3.4 RETR_TREE完整层级结构RETR_TREE模式会检测所有轮廓并建立完整的层级树结构。这是最详细的模式能够反映轮廓之间所有的嵌套关系。特点建立完整的父子层级关系可以表示任意深度的嵌套计算量最大内存占用最多提供最完整的轮廓关系信息contours, hierarchy cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)复杂层级示例轮廓0: [4, -1, 1, -1] # 顶级轮廓 轮廓1: [-1, -1, 2, 0] # 0的子轮廓 轮廓2: [3, -1, -1, 1] # 1的子轮廓 轮廓3: [-1, 2, -1, 1] # 1的子轮廓2的兄弟 轮廓4: [-1, 0, 5, -1] # 0的兄弟 轮廓5: [-1, -1, -1, 4] # 4的子轮廓适用场景需要完整轮廓层级信息的应用复杂形状分析图像中物体的组织结构分析当需要精确知道轮廓之间的所有关系时4. 模式选择与性能考量不同的检索模式在性能和结果上有显著差异。下面是一个对比表格模式轮廓数量层级深度速度内存使用典型应用RETR_EXTERNAL最少1级最快最低物体计数、外框检测RETR_LIST全部1级快低简单轮廓分析RETR_CCOMP全部2级中等中等物体与洞区分RETR_TREE全部任意最慢最高复杂形状分析在实际项目中选择模式时应考虑以下因素是否需要内部轮廓如果只关心物体外部形状选择RETR_EXTERNAL是否需要层级关系简单的轮廓分析用RETR_LIST需要嵌套信息用RETR_CCOMP或RETR_TREE性能要求对实时性要求高的应用应选择简单模式后续处理需求某些算法如轮廓填充需要特定的层级信息注意OpenCV的不同版本在轮廓检测的输出格式上可能有差异。较新版本通常返回两个值(contours, hierarchy)而旧版本可能返回三个值。使用前应检查文档。5. 实战案例文档扫描与表格识别让我们通过一个实际案例来展示不同模式的应用。假设我们要处理一张包含多个表格的文档图像目标是提取每个表格的外框。使用RETR_EXTERNAL# 只检测最外层轮廓表格外框 contours, _ cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: x,y,w,h cv2.boundingRect(cnt) cv2.rectangle(image, (x,y), (xw,yh), (0,255,0), 2)这种方法快速简单但会丢失表格内部结构信息。使用RETR_TREE# 获取完整层级结构 contours, hierarchy cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 筛选出顶级轮廓表格及其直接子轮廓行/列 for i, cnt in enumerate(contours): if hierarchy[0][i][3] -1: # 没有父轮廓的是顶级轮廓 # 绘制表格外框 x,y,w,h cv2.boundingRect(cnt) cv2.rectangle(image, (x,y), (xw,yh), (0,255,0), 2) # 查找并绘制子轮廓表格内部线条 child_idx hierarchy[0][i][2] while child_idx ! -1: xc,yc,wc,hc cv2.boundingRect(contours[child_idx]) cv2.rectangle(image, (xc,yc), (xcwc,ychc), (255,0,0), 1) child_idx hierarchy[0][child_idx][0] # 下一个兄弟轮廓这个例子展示了如何利用层级信息进行更精细的分析。在实际项目中根据具体需求选择合适的模式可以大大提高开发效率和结果质量。

相关文章:

别再被hierarchy搞晕了!OpenCV cv2.findContours四种模式(RETR_*)保姆级图解指南

OpenCV轮廓检测全解析:四种层级模式与实战图解 轮廓检测是计算机视觉中最基础也最强大的工具之一,但很多开发者在面对cv2.findContours的层级参数时常常感到困惑。本文将用直观的可视化方式,带你彻底理解RETR_EXTERNAL、RETR_LIST、RETR_CCOM…...

BallonTranslator:3分钟搞定漫画翻译的终极AI工具,完全免费开源!

BallonTranslator:3分钟搞定漫画翻译的终极AI工具,完全免费开源! 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by…...

传输对象模式

传输对象模式 概述 传输对象模式(Object Transfer Pattern)是一种设计模式,它允许在组件之间传递复杂对象,而不是简单的数据值。这种模式通常用于分布式系统中,特别是在需要在不同进程或不同机器之间传递对象时。传输对象模式可以有效地提高系统的可扩展性和可维护性。 …...

保姆级避坑指南:在PVE 7.4上完美安装Windows 11专业版(解决TPM、驱动、磁盘识别问题)

PVE 7.4深度优化:Windows 11专业版安装全流程避坑手册 对于虚拟化技术爱好者来说,在Proxmox VE(PVE)上安装Windows 11专业版既是一次性能挑战,也是一次技术探索。不同于简单的安装指南,本文将聚焦于那些让大…...

打卡信奥刷题(3259)用C++实现信奥题 P8652 [蓝桥杯 2017 国 C] 小数第 n 位

P8652 [蓝桥杯 2017 国 C] 小数第 n 位 题目描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 000,它们就有了统一的形式。 本题的任务是:在上面的约定下&a…...

文档即播客时代已来,你还在手动录音?NotebookLM自动化播客流水线搭建全解析

更多请点击: https://intelliparadigm.com 第一章:文档即播客时代已来,你还在手动录音? 当 Markdown 文件能自动生成语音流、API 文档可一键转为双语播客、技术博客支持语义分段朗读与知识图谱锚点跳转时,“文档即播客…...

深圳汽车救援公司有哪些

行业痛点分析在深圳这座现代化大都市中,汽车已成为市民出行的重要工具。然而,随之而来的汽车救援问题也日益凸显。当前,汽车救援领域面临的技术挑战主要包括响应速度慢、救援效率低、服务范围有限等问题。据数据表明,深圳市内每天…...

蓝奏云直链解析实战指南:一站式自动化高速下载解决方案

蓝奏云直链解析实战指南:一站式自动化高速下载解决方案 【免费下载链接】LanzouAPI 蓝奏云直链,蓝奏api,蓝奏解析,蓝奏云解析API,蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 还在…...

Android定位模拟技术全解析:Xposed Hook实现位置伪造的完整指南

Android定位模拟技术全解析:Xposed Hook实现位置伪造的完整指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在移动应用开发和测试领域,Android定位模拟…...

JIT推不动?精益生产看板+节拍管理,解决多品种小批量生产难题!

很多制造工厂推行JIT准时化生产时,都会陷入一个共性困境:多品种、小批量的生产模式下,订单批次多、批量小、切换频繁,导致生产计划混乱、工序衔接不畅、物料流动失控,JIT推行举步维艰——要么出现缺料停产,…...

如何快速掌握Obsidian OCR插件:面向初学者的完整教程

如何快速掌握Obsidian OCR插件:面向初学者的完整教程 【免费下载链接】obsidian-ocr Obsidian OCR allows you to search for text in your images and pdfs 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-ocr 你是否曾为无法搜索图片和PDF中的文字…...

ARM64虚拟化实战:Proxmox VE在ARM平台上的完整部署指南

ARM64虚拟化实战:Proxmox VE在ARM平台上的完整部署指南 【免费下载链接】Proxmox-Arm64 Proxmox VE & PBS unofficial arm64 version 项目地址: https://gitcode.com/gh_mirrors/pr/Proxmox-Arm64 随着ARM64架构在树莓派、Rockpi等开发板以及服务器领域的…...

jank:基于LLVM的Clojure方言,实现原生编译与C++无缝互操作

1. 项目概述:当Clojure拥抱LLVM如果你和我一样,既沉迷于Clojure那种简洁、优雅、函数式的编程体验,又时常对JVM的启动时间、内存占用,或者与底层系统交互时的“隔靴搔痒”感到一丝无奈,那么jank的出现,无疑…...

Xenos DLL注入器:Windows动态加载5个核心技巧完整指南

Xenos DLL注入器:Windows动态加载5个核心技巧完整指南 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos Xenos是一款基于Blackbone库开发的强大Windows DLL注入工具,专为软件开发者和系统管理员设…...

WeChatExporter:打造个人数字记忆档案馆的终极解决方案

WeChatExporter:打造个人数字记忆档案馆的终极解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾想过,那些看似普通的微信聊天记录…...

《行李箱的梦想》的搜索理由:出发场景如何被记住

从内容传播角度看,《行李箱的梦想》有一个稳定入口:它把远方、整理和出发压缩进一个人人都能理解的物件里,搜索记忆点天然成立。这首歌不适合被写成空泛励志。行李箱的好处在于具体,它能装衣服,也能装犹豫、计划和还没…...

Microsoft 365 E7 ,“AI+安全+身份”三位一体,打造 AI 时代的一站式操作系统

在AI智能体加速渗透企业各个业务场景的今天,如何在释放AI生产力的同时,有效管控智能体带来的安全与治理风险,成为了所有企业数字化转型过程中必须面对的核心挑战。2026年5月1日,微软正式推出Microsoft 365 E7(前沿办公…...

实操:快速把零克云“云端龙虾”将OpenClaw接入飞书

使用零克云“云端龙虾”OpenClaw,将它接入你的飞书,可极大提高您的办公效率!包括信息搜集与整理、整理文档,也可以进行日程与提醒管理,或者进行自媒体内容创作。如何快速把零克云OpenClaw“云端龙虾”接入飞书&#xf…...

掌握Geckodriver:现代Web自动化测试的核心桥梁

掌握Geckodriver:现代Web自动化测试的核心桥梁 【免费下载链接】geckodriver WebDriver Classic proxy for automating Firefox through Marionette 项目地址: https://gitcode.com/gh_mirrors/ge/geckodriver 在当今快速发展的Web开发领域,自动化…...

别再手动挖铜了!Cadence Allegro 16.6 Shape Edit Mode 电源分割效率翻倍指南

别再手动挖铜了!Cadence Allegro 16.6 Shape Edit Mode 电源分割效率翻倍指南 PCB设计工程师最头疼的场景之一,莫过于项目临近交付时突然接到芯片选型变更通知——需要紧急增加一组1.2V电源平面。传统做法是删除整块铜皮重新绘制,不仅耗时费力…...

从ZZULIOJ这道题出发,聊聊面试常客:有序数组合并的三种写法与性能对比

从有序数组合并看算法优化:三种解法与百万级数据处理实战 在技术面试中,有序数组合并是一个经典且高频出现的问题。它不仅考察候选人对基础算法的掌握程度,更能检验其在实际问题中的优化思维。本文将以ZZULIOJ平台上的1124题为例,…...

Bebas Neue开源字体技术深度解析:几何美学的现代实现与商业应用策略

Bebas Neue开源字体技术深度解析:几何美学的现代实现与商业应用策略 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue是一款基于SIL Open Font License 1.1开源协议的现代几何无衬线字体&am…...

从硬盘拷贝文件到内存,CPU真的在摸鱼吗?深入聊聊DMA背后的性能优化哲学

从硬盘拷贝文件到内存,CPU真的在摸鱼吗?深入聊聊DMA背后的性能优化哲学 当你从硬盘拷贝一个10GB的电影文件到内存时,系统监控显示CPU占用率几乎没变化——这似乎违背直觉。难道CPU真的在"摸鱼"?实际上,这背后…...

洛雪音乐源下载异常全面修复手册:从排查到根治的完整指南

洛雪音乐源下载异常全面修复手册:从排查到根治的完整指南 【免费下载链接】lx-source lx-music-custom-source 洛雪音乐自定义解析源 项目地址: https://gitcode.com/gh_mirrors/lx/lx-source 洛雪音乐源作为一款优秀的音乐解析服务工具,在实际使…...

6SE7015-0EP50-Z 控制逆变器单元

6SE7015-0EP50-Z 是西门子 SIMOVERT MasterDrives 系列的一款控制逆变器单元,结构紧凑、可靠性高,适用于工业环境中的电机调速控制。中间 15 条特点:结构紧凑,占用空间小。支持三相 380V 至 480V 宽电压输入。输出频率范围宽&…...

使用 GES DISC 的 IMAP-DOAS 预处理器 (IDP) 正向处理 V10 (OCO3_L2_IMAPDOAS) 筛选 OCO-3 二级空间排序地理定位反演结果

OCO-3 Level 2 spatially ordered geolocated retrievals screened using the IMAP-DOAS Preprocessor (IDP), Forward Processing V10 (OCO3_​L2_​IMAPDOAS) at GES DISC 简介 版本 10 是该数据集的当前版本。旧版本将不再可用,并被版本 10 取代。 轨道碳观测站…...

告别蓝屏与闪退:揪出“ntdll.dll”相关故障的五大根源及实战修复

在Windows的世界里,ntdll.dll就像一位无处不在的“幕后总调度”。无论是您点击的办公软件,还是运行的游戏,最终都需要通过它来向系统内核发出请求。正因如此,一旦它出现问题,故障现象会千奇百怪:程序突然闪…...

Code2Context:自动生成AI编程助手项目上下文,提升代码理解与生成质量

1. 项目概述:当AI助手需要“读懂”你的代码库如果你和我一样,日常开发已经离不开像 Cursor、Claude Code 或 GitHub Copilot 这样的 AI 编程助手,那你肯定也遇到过这个核心痛点:AI 给出的建议质量,严重依赖于它对当前项…...

6月即将生效!TikTok Shop美区退货政策大改,商家承担所有买家责任退货运费

在跨境电商竞争日趋激烈的当下,任何平台规则的调整都直接关乎卖家的经营命脉。近日,TikTok Shop美区发布的一则公告,便在卖家群体中引发了广泛的关注与热议。根据公告,自2026年6月起,凡是因消费者个人原因发起的退货&a…...

BlocPad CLI:为AI编程助手提供结构化上下文的工程实践

1. 项目概述:BlocPad CLI,一个为工程智能体设计的上下文驱动工具如果你和我一样,日常开发中深度依赖像 Cursor、Claude Code 或 GitHub Copilot 这类 AI 编程助手,那你肯定也遇到过这样的困境:如何让 AI 助手清晰地理解…...