如何检测内外轮廓
该博文讲解的挺为详细
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 ,那么其为外轮廓,
以上的判断方法仅仅针对嵌套不多的情况,如果嵌套较为复杂的情况那就得多重判断了,譬如多个环状物嵌套。不过在实际的问题处理过程中场景多比较简洁。