6

【Python】【OpenCV】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE) - Va...

 8 months ago
source link: https://www.cnblogs.com/vangoghpeng/p/17929206.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【Python】【OpenCV】关于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)更远就会被优先检测到,并优先命名编号。

3275597-20231226200806089-184956579.png

 1、先自己创建了一个array数组并初始化为0(也就是都是黑色)

 2、绘制三个区域,大小为50x50的正方形,并置为白色

 3、pretreatment是个函数,自行修改成cv2.findContours()然后再cv2.drawContours()即可,这边就懒得改了~

3275597-20231226201135825-1585326215.png

 上图展示了我们绘制的三个白块,并对他们的轮廓进行了绘制,接下来我们依次查找index为0的轮廓。

1、当水平方向位移量不同,垂直方向位移量相同时,右方的白块会被优先检测到,我们绘制出index为0的轮廓(绿色):

3275597-20231226201947525-584837118.png

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

3275597-20231226202237456-299019812.png

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

3275597-20231226202554313-559202472.png

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

3275597-20231226202957149-1011358916.png

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

[1, -1, -1, -1]、[2, 0, -1, -1]、[3, 1, -1, -1]、[-1, 2, -1, -1]

3275597-20231226203534273-1416505177.png

 和程序中得到的hierarchy结果相同,至此关于RETR_TREE模式的轮廓索引(编号)理解就到位了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK