这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。
如果有喜欢我笔记的请麻烦帮我关注、点赞、评论。谢谢诸位。
学习笔记:
学习笔记目录里面会收录我关于OpenCV系列学习笔记博文,大家如果有什么不懂的可以通过阅读我的学习笔记进行学习。
【OpenCV学习笔记】- 学习笔记目录
内容
- 了解轮廓的层次结构,即Contours中的父子关系。
理论
在最近几篇关于轮廓的文章中,我们使用了 OpenCV 提供的几个与轮廓相关的函数。但是当我们使用 cv.findContours() 函数找到图像中的轮廓时,我们传递了一个参数Contour Retrieval Mode。我们通常传递 cv.RETR_LIST 或 cv.RETR_TREE 并且效果很好。但它实际上意味着什么?
另外,在输出中,我们得到了三个数组,第一个是图像,第二个是轮廓,还有一个输出,我们将其命名为层次结构(请查看之前文章中的代码)。但我们从未在任何地方使用过这种层次结构。那么这个层次结构是什么呢?它的用途是什么?它与前面提到的函数参数有什么关系?
这就是我们将在本文中讨论的内容。
什么是层次结构?
通常我们使用 cv.findContours() 函数来检测图像中的对象,对吗?有时物体位于不同的位置。但在某些情况下,某些形状位于其他形状内部。就像嵌套的数字一样。在这种情况下,我们将外部的一个称为父级,将内部的一个称为子级。这样,图像中的轮廓彼此之间就存在某种关系。我们可以指定一个轮廓如何相互连接,例如,它是其他轮廓的子轮廓,还是父轮廓等。这种关系的表示称为层次结构。
考虑下面的示例图像:
在这张图片中,有一些形状我从0-5编号。2和2a表示最外面的盒子的外部和内部轮廓。
这里,轮廓 0,1,2 在外部或最外面。我们可以说,它们位于层次结构-0中,或者简单地说它们位于同一层次结构级别中。
接下来是轮廓2a。它可以被视为轮廓2 的子级(或者相反,轮廓2 是轮廓2a 的父级)。所以让它位于层次结构1中。同样,轮廓3 是轮廓2 的子级,它位于下一个层次结构中。最后,轮廓 4,5 是轮廓 3a 的子级,它们位于最后一个层次结构级别。从我给盒子编号的方式来看,我会说轮廓4是轮廓3a的第一个子元素(也可以是轮廓5)。
我提到这些是为了理解诸如相同层次结构级别、外部轮廓、子轮廓、父轮廓、第一个子轮廓等术语。现在让我们进入 OpenCV。
OpenCV 中的层次结构表示
每个轮廓都有自己的信息,包括它的层次结构、谁是其子级、谁是其父级等。OpenCV 将其表示为包含四个值的数组:[Next、Previous、First_Child、Parent]
- Next 表示相同等级的下一个轮廓。例如,在我们的图片中取轮廓 0。谁是同一级别的下一个轮廓?它是轮廓1。因此,只需输入 Next = 1。类似地,对于 轮廓1,下一个是轮廓-2。所以Next = 2。
轮廓2呢?同一级别中没有下一个轮廓。简单地说,输入 Next &