当前位置:网站首页>(12) findContours function hierarchy explanation
(12) findContours function hierarchy explanation
2022-08-10 19:56:00 【Heng Youcheng】
欢迎访问个人网络日志知行空间
1.基本用法
Get the outline of the object,Generally, it is best to first grayscale the image and then perform thresholding,and then used to detect contours.
void cv::findContours(
InputOutputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point()
)
- image: 8位单通道图像
- contours: 检测到的轮廓,
vector<vector<cv::Point>> - hierarchy: Nesting and proximity relationships between detected contours,
vector<cv::Vec4i> - mode: Different contour detection algorithms,常用的有
RETR_EXTERNAL/RETR_LIST/RETR_CCOMP/RETR_TREE四种 - method: 轮廓逼近方法,见,Contours can be represented using fewer points,减少内存占用.
- offset: The amount by which the contour points should be offset,当在
roiIt is useful when you want to restore the original image after extracting the contour.
2.轮廓提取模式
第四个参数mode,Different contour extraction algorithms can be selected,常用的有RETR_EXTERNAL/RETR_LIST/RETR_CCOMP/RETR_TREE四种.下面分别进行介绍.在findContours函数中,其第3个参数hierarchyRepresents a hierarchical relationship between contours,对于不同modecontour extraction algorithm,其返回的值是不同的.如下图【来自于OpenCV Doc】:

Different contours in the graph have hierarchical embedded relationships,We call the outer contours 父,The inner contour is called子,hierarchyIt is a matrix representing the parent-child and adjacent relationship of contours.上图中有0/1/2/3/4/5/2a/3a 8 个轮廓,其中0,1,2is the outermost contour,Can be recorded as they are in the hierarchy0hierarchy-0.而2a是轮廓2的子轮廓,Note that it is in the hierarchy1hierarchy 1.同样轮廓3是轮廓2a的子轮廓,Note that it is in the hierarchy2hierarchy 2.同样轮廓3a是轮廓3的子轮廓,Note that it is in the hierarchy3hierarchy 3.4/5是3a的子轮廓,its composition hierarchy4hierarchy 4. The contours belonging to each layer have their own information,Such as what its sub-contours are,What is the parent profile,OpenCVThe relationship of each contour to other contours is represented by a four-element array,The values in this four-dimensional array are represented separately**[Next, Previous, First_Child, Parent], NextIndicates that they belong to the same levelhierarchythe next contour,Outline above0为例,0,1,2belong to the same levelhierarchy-0的轮廓,因此0的Next是1,1的Next是2.contours in the same level2已经是最后一个了,因此其Next是-1.The same goes for the contours in the image above4,It belongs to the same level4hierarchy-4的轮廓是5,因此4的Next=5,而5的Next=-1.PreviousRepresents the previous contour in the same level**,如上图,1的Previous=0, 2的Previous=1,0的Previous=-1.First_ChildRepresents the first subcontour of the current contour,如上图,0的First_Child=-1,2的First_Child=2a,3a的First_Child=4.ParentRepresents the parent contour of the current contour,如上图,4和5The parent contours of 3a,3a的父轮廓是3,3的父轮廓是2a,2的Parent=-1.
findContours方法中的modeparameters will return differenthierarchy信息,Because some algorithms will find the nesting and adjacent relationship between contours,Some just find the contours without parsing the information between the contours.
2.1 RETR_LIST
RETR_LISTThe algorithm will only return contour information,There is no nesting information between contours.因此,All contours belong to the same levelhierarchy没有父子关系, hierarchy返回值中只有Next和Previous,Parent和First_Child都为-1.The first of a four-dimensional array3和第4个元素都是-1.Run as shown abovefindContours后的输出:
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, 5, -1, -1]
[-1, 6, -1, -1]
这里的0/1/2/3/4/5/6/7Correspondingly, the outline is incontours中的下标.
2.2 RETR_EXTERNAL
RETR_EXTERNAL算法,Only the outermost contour information will be returned,All subcontours are not returned,如上图,使用RETR_EXTERNALThe algorithm will just returnhierarchy-0层级0的3个轮廓.当然hierarchy中也只有3proximity information between contours,Parent和First_Child依然都为-1.

findContours(image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
[1, -1, -1, -1]
[2, 0, -1, -1]
[-1, 1, -1, -1]
2.3 RETR_CCOMP
RETR_CCOMPThe algorithm will find all the contours in the graph,But only the outlines will be organized into two layershierarchy=2.The outer contour of the object belongs tohierarchy-0,The inner contour belongs tohierarchy-1,如上图0/1/2/3/4/5都属于hierarchy-0,而2a/3a属于hierarchy-1.
findContours(image, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
[1, -1, -1, -1]
[2, 0, -1, -1]
[4, 1, 3, -1]
[-1, -1, -1, 2]
[6, 2, 5, -1]
[-1, -1, -1, 4]
[7, 4, -1, -1]
[-1, 6, -1, -1]
It's worth noting for contours2a和3a,其hierarchy分别是[-1, -1, -1, 2]和[-1, -1, -1, 4].这是因为2a和3a虽然属于hierarchy-1,But there is still an outline in the middle3,因此2a和3aThere is no proximity relationship between them.
再来看个例子,如下图:【来自于OpenCV Doc】

轮廓0is the outer contour,1和2respectively the outline0The inner contour of the enclosed object,4belongs to the inner contour,3belong to the outer contour,6belongs to the inner contour,5belong to the outer contour,7和8Also belong to the outer contour.对于轮廓0其属于hierarchy-1,Two inner contours1和2属于hierarchy-2.So for contours0,其Next=3,same levelhierarchy level的下一个,previous=-1,‵First-Child=1,so outline0的hierarchy=[3,-1, 1, -1]`.
轮廓1belong to the hierarchy2,hierarchy-2,its next at the same level(与1in the same parent outline)轮廓是2,其他均为-1,因此轮廓1的hierarchy=[2, -1, -1, 0].
轮廓2belong to the hierarchy2,hierarchy-2,Its previous contour is under the same parent outer contour1,其余为-1,因此轮廓2的hierarchy=[-1, 1, -1, 0].
轮廓3在hierarchy-1中的Next=5,Previous=0,First-Child=4,Parent=-1.
>>> hierarchy
array([[[ 3, -1, 1, -1],
[ 2, -1, -1, 0],
[-1, 1, -1, 0],
[ 5, 0, 4, -1],
[-1, -1, -1, 3],
[ 7, 3, 6, -1],
[-1, -1, -1, 5],
[ 8, 5, -1, -1],
[-1, 7, -1, -1]]])
2.4 RETR_TREE
RETR_TREEThe algorithm extracts all contours,and returns the nested relationship between all contours.如上图,使用RETR_TREEthe resulting contourhierarchy之间的关系为:【来自于OpenCV Doc】The green words in parentheses indicate the level to which the contour belongshierarchy.

以轮廓0为例,其属于hierarchy-0,‵Next=7, Previous=-1, First_Child=1, Parent=-1`.
>>> hierarchy
array([[[ 7, -1, 1, -1],
[-1, -1, 2, 0],
[-1, -1, 3, 1],
[-1, -1, 4, 2],
[-1, -1, 5, 3],
[ 6, -1, -1, 4],
[-1, 5, -1, 4],
[ 8, 0, -1, -1],
[-1, 7, -1, -1]]])

findContours(image, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
[3, -1, 1, -1]
[2, -1, -1, 0]
[-1, 1, -1, 0]
[5, 0, 4, -1]
[-1, -1, -1, 3]
[6, 3, -1, -1]
[-1, 5, -1, -1]
3.测试代码
#include <opencv2/opencv.hpp>
#include <common.h>
using namespace std;
int main(int argc, char **argv)
{
cv::RNG rng(12345);
cout << "Usage: " << argv[0] << "\n";
cv::String img_dir = "/images/OpenCV/2findContours/hole-hierarchy.png";
cv::Mat image = cv::imread(img_dir, cv::IMREAD_GRAYSCALE);
vector<cv::Vec4i> hierarchy;
vector<vector<cv::Point> > contours;
findContours(image, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
cv::cvtColor(image, image, cv::COLOR_GRAY2BGR);
std::cout << "Contours Size: " << contours.size() << std::endl;
for(size_t i=0; i<contours.size(); i++)
{
cv::Scalar clr = cv::Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
cv::drawContours(image, contours, i, clr, 3);
}
for(auto &v : hierarchy)
{
std::cout << v << std::endl;
}
std::cout << image.channels() << std::endl;
cv::imwrite("contours.png", image);
cv::imshow("Img", image);
cv::waitKey(0);
return 0;
}s
参考资料
欢迎访问个人网络日志知行空间
边栏推荐
- 力扣18-四数之和——双指针法
- 【毕业设计】基于STM32的天气预报盒子 - 嵌入式 单片机 物联网
- 不止跑路,拯救误操作rm -rf /*的小伙儿
- Random函数用法
- The Biotin-PEG3-Br/acid/NHS ester/alcohol/amine collection that everyone wants to share
- 多种深度模型实现手写字母MNIST的识别(CNN,RNN,DNN,逻辑回归,CRNN,LSTM/Bi-LSTM,GRU/Bi-GRU)
- 产品思维训练 | 新用户从注册到绑卡流失率很高是什么原因?
- uni-app 数据上拉加载更多功能
- 第15章_锁
- 铁蛋白颗粒Tf包载多肽/凝集素/细胞色素C/超氧化物歧化酶/多柔比星(定制服务)
猜你喜欢

【初学必备】3d游戏建模入门基础知识
[Teach you how to do mini-games] How to lay out the hands of Dou Dizhu?See what the UP master of the 250,000 fan game area has to say

网络虚拟化

laya打包发布apk

spark学习笔记(九)——sparkSQL核心编程-DataFrame/DataSet/DF、DS、RDD三者之间的转换关系

【毕业设计】基于STM32的天气预报盒子 - 嵌入式 单片机 物联网
We used 48h to co-create a web game: Dice Crush, to participate in international competitions

redis 事件

【C#】WCF和TCP消息通信练习,实现群聊功能

Colocate Join :ClickHouse的一种高性能分布式join查询模型
随机推荐
小分子PEG CAS:1352814-07-3生物素-PEG6-丙酸叔丁酯
[TAPL] 概念笔记
LeetCode·283.移除零·双指针
运维面试题(每日一题)
【C#】WCF和TCP消息通信练习,实现群聊功能
怎么完全卸载赛门铁克_Symantec卸载方法,赛门铁克卸载「建议收藏」
新建离线同步节点时选择数据去向-表时报错,数据库类型是adb pg,怎么办?
Win11连接投影仪没反应怎么解决?
uni-app 数据上拉加载更多功能
CAS:2055042-70-9_N-(叠氮基-PEG4)-生物素
Rider调试ASP.NET Core时报thread not gc-safe的解决方法
2022杭电多校七 Black Magic (签到)
【SemiDrive源码分析】【MailBox核间通信】52 - DCF Notify 实现原理分析 及 代码实战
回老家去?
Modern Privacy-Preserving Record Linkage Techniques: An Overview论文总结
哈工大软件构造Lab3(2022)
手把手教你Charles抓包工具使用
flask装饰器版登录、session
水溶性合金量子点纳米酶|CuMoS纳米酶|多孔硅基Pt(Au)纳米酶|[email protected]纳米模拟酶|PtCo合金纳米粒子
转铁蛋白修饰长春新碱-粉防己碱脂质体|转铁蛋白修饰共载紫杉醇和金雀异黄素脂质体(试剂)