【OpenCV】【Python】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)
在打算自己实现二维码的定位的时候,看到了相关博文的关于cv2.findContours返回的层级信息来定位三个“回”字从而达到定位二维码的目的,但是返回的hierarchy中的层级信息分别对应的是哪个轮廓却困扰了许久,查阅了很多资料最后还是自己手动找出了清晰的规律。
关于hierarchy返回的每一组list中的每个元素的意义分别是:
1、Next 表示相同等级的下一个轮廓。
2、Previous 表示相同轮廓级别的上一个轮廓。
3、First_Child 表示其第一个子轮廓。
4、Parent 代表示其父代轮廓的索引。
具体的描述我就不过多赘述了,相关资料可以跳转参考 -> OpenCV-Python轮廓层次结构|极客笔记 (deepinout.com)
这里只介绍针对同一层级的轮廓序号是如何命名,先给出结论,在同一层级中(可以看作是一个坐标系xy),垂直方向 > 水平方向 (即,先找寻y轴,当y轴相同时再找寻x轴),哪个轮廓离原点(0,0)更远就会被优先检测到,并优先命名编号。
上代码:

1、先自己创建了一个array数组并初始化为0(也就是都是黑色)
2、绘制三个区域,大小为50x50的正方形,并置为白色
3、pretreatment是个函数,自行修改成cv2.findContours()然后再cv2.drawContours()即可,这边就懒得改了~

上图展示了我们绘制的三个白块,并对他们的轮廓进行了绘制,接下来我们依次查找index为0的轮廓。
1、当水平方向位移量不同,垂直方向位移量相同时,右方的白块会被优先检测到,我们绘制出index为0的轮廓(绿色):

2、当水平方向位移量相同,垂直方向位移量不同时,下方的白块会被优先检测到:

3、当水平方向位移不同,垂直方向位移不同时,先找y轴:

最后我们显示四个白块,并将hierarchy数据展示出来:

根据之前的检测顺序,我已经标出了从0~3这四个轮廓的编号,下面我们先自己写出每个轮廓的hierarchy:
[1, -1, -1, -1]、[2, 0, -1, -1]、[3, 1, -1, -1]、[-1, 2, -1, -1]

和程序中得到的hierarchy结果相同,至此关于RETR_TREE模式的轮廓索引(编号)理解就到位了。
【OpenCV】【Python】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)的更多相关文章
- python调用cv2.findContours时报错:ValueError: not enough values to unpack (expected 3, got 2)
OpenCV旧版,返回三个参数: im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_S ...
- OpenCV—Python 轮廓检测 绘出矩形框(findContours\ boundingRect\rectangle
千万注意opencv的轮廓检测和边缘检测是两码事 本文链接:https://blog.csdn.net/wsp_1138886114/article/details/82945328 1 获取轮廓 O ...
- Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题
一.问题如下: cv2.findContours()这个方法是用来找出轮廓值的: # cv2.findContours找出轮廓值,cv2.RETR_EXTERNAL表示图像的外轮廓 binary, c ...
- 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..
1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓
阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...
- opencv+python视频实时质心显示
利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...
- 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)
7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...
- OpenCV+Python识别车牌和字符分割的实现
本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...
- OpenCV Python教程(3、直方图的计算与显示)
转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...
随机推荐
- 图解 LeetCode 算法汇总——链表
本文首发公众号:小码A梦 一般数据主要存储的形式主要有两种,一种是数组,一种是链表.数组是用来存储固定大小的同类型元素,存储在内存中是一片连续的空间.而链表就不同于数组.链表中的元素不是存储在内存中可 ...
- Python爬虫——爬虫时如何知道是否代理ip伪装成功?
在进行爬虫时,我们可能需要使用代理IP来伪装自己的身份,以避免被网站封禁.如何判断代理IP是否伪装成功呢?本篇文章将围绕这个问题展开讲解,同时提供Python代码示例. 1. 确认代理IP地址 首先, ...
- xftp 7必须更新最新版本怎么解决
下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找"0f88 ...
- 基于Spring事件驱动模式实现业务解耦
事件驱动模式 举个例子 大部分软件或者APP都有会有会员系统,当我们注册为会员时,商家一般会把我们拉入会员群.给我们发优惠券.推送欢迎语什么的. 值得注意的是: 注册成功后才会产生后面的这些动作: 注 ...
- Java编程之道:巧妙解决Excel公式迭代计算难题
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 什么是迭代计算 迭代计算其实是在 Excel 中,一种公式的循环引用,对于了 ...
- Java内部类与匿名类
内部类 定义: 一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类 //外部类 class Outer { //内部类 class Inner { } ...
- HTML DOM之二:事件
对事件作出反应 当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时. 如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中: ...
- DM数据库SQL分页案例
DM一哥们找我优化条分页的SQL语句,结果集很小返回99行数据,废话不说安排一下. 原始SQL语句如下,保密要求,给真实的表名换了别名: SELECT count(*) FROM (SELECT TM ...
- 广度优先搜索— —提高Ⅲ(BFS优化)
双向广搜 所谓双向广搜,就是初始结点向目标结点和目标结点向初始结点同时扩展,直至在两个扩展方向上出现同一个结点,搜索结束.它适用的问题是,扩展结点较多,而目标结点又处在深沉,如果采用单纯的广搜解题,搜 ...
- C语言假设今天是星期日,编写一个程序,求2019天后是星期几。
#include<stdio.h> void main() { int n = 2019, d;//定义变量和常量 d = n % 7;//计算余数 switch (d)//选择星期 { ...