(十二) findContours函数的hierarchy详解

本文详细介绍了OpenCV中轮廓提取的基本用法及不同模式(RETR_LIST, RETR_EXTERNAL, RETR_CCOMP, RETR_TREE)的特点与应用。通过具体实例展示了如何理解轮廓之间的层级关系及其在图像处理中的作用。

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.基本用法

获取对象的轮廓,一般最好先对图像进行灰度化再进行阈值处理,然后用来检测轮廓。


void cv::findContours(
     InputOutputArray image,
     OutputArrayOfArrays contours,
     OutputArray hierarchy,
     int mode,
     int method,
     Point offset = Point() 
)
  • image: 8位单通道图像
  • contours: 检测到的轮廓,vector<vector<cv::Point>>
  • hierarchy: 检测到的轮廓之间的嵌套和邻近关系,vector<cv::Vec4i>
  • mode: 不同的轮廓检测算法,常用的有RETR_EXTERNAL/RETR_LIST/RETR_CCOMP/RETR_TREE四种
  • method: 轮廓逼近方法,,可使用更少的点表示轮廓,减少内存占用。
  • offset: 轮廓点应该偏移的量,当在roi上提取轮廓后想还原到原图上时比较有用。

2.轮廓提取模式

第四个参数mode,可以选择不同的轮廓提取算法,常用的有RETR_EXTERNAL/RETR_LIST/RETR_CCOMP/RETR_TREE四种。下面分别进行介绍。在findContours函数中,其第3个参数hierarchy表示的轮廓之间的层级关系,对于不同mode的轮廓提取算法,其返回的值是不同的。如下图【来自于OpenCV Doc】:

在这里插入图片描述

图中不同的轮廓有层级嵌入关系,我们将外部的轮廓称为,内部的轮廓称为hierarchy就是表示轮廓的父子和邻近关系的矩阵。上图中有0/1/2/3/4/5/2a/3a 8 个轮廓,其中0,1,2是最外侧的轮廓,可记为它们在层级0hierarchy-0。而2a是轮廓2的子轮廓,记为其在层级1hierarchy 1。同样轮廓3是轮廓2a的子轮廓,记为其在层级2hierarchy 2。同样轮廓3a是轮廓3的子轮廓,记为其在层级3hierarchy 34/53a的子轮廓,其构成层级4hierarchy 4。 属于每个层的轮廓都有其自己的信息,如它的子轮廓是什么,父轮廓是什么,OpenCV通过一个四个元素的数组来表示每个轮廓与其他轮廓的关系,这个四维数组中的值分别表示**[Next, Previous, First_Child, Parent], Next表示属于同一个层级hierarchy的下一个轮廓,以上图轮廓0为例,0,1,2属于同个层级hierarchy-0的轮廓,因此0Next1,1Next2。同一个层级中轮廓2已经是最后一个了,因此其Next-1。同样对于上图的轮廓4,与其同属于层级4hierarchy-4的轮廓是5,因此4Next=5,而5Next=-1Previous表示同一层级中之前的的那个轮廓**,如上图,1Previous=0, 2Previous=1,0Previous=-1First_Child表示当前轮廓的第一个子轮廓,如上图,0First_Child=-1,2First_Child=2a,3aFirst_Child=4Parent表示当前轮廓的父轮廓,如上图,45的父轮廓都是3a3a的父轮廓是3,3的父轮廓是2a,2Parent=-1

findContours方法中的mode参数会返回不同的hierarchy信息,因为有些算法会找出轮廓间的嵌套和邻近关系,有些则只是把轮廓找出来而不会解析轮廓之间的信息。

2.1 RETR_LIST

RETR_LIST算法只会返回轮廓信息,而没有轮廓间的嵌套信息。因此,所有的轮廓都属于同个层级hierarchy没有父子关系, hierarchy返回值中只有NextPreviousParentFirst_Child都为-1。四维数组的第3和第4个元素都是-1。如上图运行findContours后的输出:

findContours(image, contours, hierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
>>> hierarchy
[1, -1, -1, -1]
[2, 0, -1, -1]
[3, 1, -1, -1]
[4, 2, -1, -1]
[5, 3, -1, -1]
[6, 4, -1, -1]
[7,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值