如何检测内外轮廓

 

该博文讲解的挺为详细

https://blog.csdn.net/qq_42593411/article/details/119712232

https://blog.csdn.net/hai411741962/article/details/132165910

通过对上述两篇博客的阅读,博主也做了一些实验,先将个人的理解简单复述一下,希望能帮助大家快速了解其使用方法。

先加上一段示例代码

//cv::CV_RETR_EXTERNAL 只检测外轮廓
//cv::CV_RETR_CCOMP  同时检测内外轮廓(例如环行物)

cv::findContours(erodeResult, contoursOfCutArea, /*hierarchy,*/ CV_RETR_EXTERNAL/* 外轮廓*/, CV_CHAIN_APPROX_SIMPLE);

cv::findContours(erodeResult, innerContours, hierarchy, CV_RETR_CCOMP/* 同时包含内外部轮廓*/, CV_CHAIN_APPROX_SIMPLE);

如何判断是内轮廓还是外轮廓呢?

hierarchy则对内外轮廓关系进行了一个简单的记录(闭合线的索引号)(不知道这样的理解是否合适,如有不妥的地方还望大神指正)。

每一条轮廓线对应一个hierarchy数组,该数组的大小为4;

假设第n条线的hierarchy值输出如下:

[ 1 -1 -1 -1]
它(即第 0 个轮廓)的后一个轮廓是第 1 个轮廓,因此第 1 个元素的值为“1”。
它的前一个轮廓不存在,因此第 2 个元素的值是“-1”。
它不存在子轮廓,因此第 3 个元素的值是“-1”。
它不存在父轮廓,因此第 4 个元素的值是“-1”。

所以hierarchy[n][3]!=-1 ,那么其为内轮廓

所以hierarchy[n][2]!=-1 ,那么其为外轮廓,

以上的判断方法仅仅针对嵌套不多的情况,如果嵌套较为复杂的情况那就得多重判断了,譬如多个环状物嵌套。不过在实际的问题处理过程中场景多比较简洁。

posted @ 2024-04-07 19:59  点小二  阅读(16)  评论(0编辑  收藏  举报