栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

学习笔记:C++环境下OpenCV的findContours函数的参数详解及优化

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习笔记:C++环境下OpenCV的findContours函数的参数详解及优化

这个是Visual Studio2019版本在OpenCV环境配置好后所显示的6个参数

cv::void findContours(cv::InputOutputArray image,
                      cv::OutputArrayOfArray contours,
                      cv::OutputArray hierarchy,
                      int mode,     int method,
                      cv::Point offset = cv::Point())


//完整形式findContours(image, countours,hierarchy, mode,method, offset);
//一般使用时仅输入这四个参数即可findContours(image,countours,mode,method);

//image:单通道图像矩阵,可以是灰度图,建议二值图像(最好是Canny/拉普拉斯等边缘检测算子处理后的)
//countours:"vector>contours"一个双重向量,向量内每个元素保存了一组由连续的point点构成的点的集合的向量,每一组point点集就是一个轮廓
//hierarchy:"vectorhierarchy","Vec4i"是Vec的别名,定义了一个“向量内每一个元素包含了四个int型变量”的向量
//mode:定义轮廓的检索模式

 参数1    image :单通道图像矩阵。待提取轮廓的图像,可以是灰度图,常用的是二值图(C++中可选择使用Canny,拉普拉斯等边缘检测算法进行二值化)

 参数2    contours :定义为一个双重向量  vector> contours  每一组Point都连续,构成一组向量集合,在图像上的显示即为一个轮廓(点集),由于一张图像往往包含很多对象,因此一个轮廓不足以描述图像中的所有对象,因此还需要一个容器去包含所有的轮廓,我们称这个包含所有轮廓的容器为轮廓集。所以我们有上述的双重向量的定义方式。    轮廓数量=contours的元素个数
 

 参数3    hierarchy :定义为  vector>hierarchy  或  vectorhierarchy,相当于hierarchy中的每个元素都是一个由4个int型组成的集合。直观的表示可以参考列数为4,行数为n的二维矩阵。这四个int型数hierarchy[i][0]~hierarchy[i][3]分别表示后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓的索引编号,如果当前轮廓所对应的这四个轮廓之一有缺失,比如说容器内的第一个轮廓为没有前一个轮廓,则相应位置hierarchy[i][1]=-1。

  参数4     mode :该参数用于定义轮廓的检索模式,一般有4种取值(也成为4个宏)

取值一:CV_RETR_EXTERNAL
CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略

官方解释为:CV_RETR_EXTERNAL retrieves only the extreme outer contours. It sets hierarchy[i][2]=hierarchy[i][3]=-1 for all the contours. 
翻译过来就是:CV_RETR_EXTERNAL  只检测最外层轮廓,对所有轮廓设置hierarchy[i][2]= hierarchy[i][3]=-1

直观的解释就是:图像检测到一个同心圆的内轮廓和外轮廓,由于外轮廓完全把内轮廓包含住了,因此只显示外轮廓,


取值二:CV_RETR_LIST   
CV_RETR_LIST检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1(即hierarchy[i][2]= hierarchy[i][3]=-1)

官方解释为:CV_RETR_LIST retrieves all of the contours without establishing any hierarchical relationships. 
翻译过来就是:CV_RETR_LIST:返回所有的轮廓,但是不建立轮廓的拓扑关系,所以hierarchical为空。
取值三:CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层

官方解释为:CV_RETR_CCOMP retrieves all of the contours and organizes them into a two-level hierarchy. At the top level, there are external boundaries of the components. At the second level, there are boundaries of the holes. If there is another contour inside a hole of a connected component, it is still put at the top level. 
翻译过来就是:CV_RETR_CCOMP:提取所有轮廓,并且将其组织为双层结构。顶层(the top levell)为连通域的外围边界,次层(the second level)为孔(hole)的内层边界,如果孔(hole)中还有其它轮廓,那么这个轮廓被划分为顶层(the top levell)。

取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

官方解释为:CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy of nested contours. This full hierarchy is built and shown in the OpenCV contours.c demo. 
翻译过来就是:CV_RETR_TREE:返回所有的轮廓,并且建立完整的拓扑结构

 参数5     method :定义轮廓的近似方法

取值一:CV_CHAIN_APPROX_NONE 
       保存物体边界上所有连续的轮廓点一般用的比较多

官方解释为:CV_CHAIN_APPROX_NONE stores absolutely all the contour points. That is, any 2 subsequent points (x1,y1) and (x2,y2) of the contour will be either horizontal, vertical or diagonal neighbors, that is, max(abs(x1-x2),abs(y2-y1))==1. 
翻译过来为:存储所有的轮廓点。这种方法下,两个连续的轮廓点,要么是水平相邻的,要么是垂直相邻的, 要么是对角相邻的,即满足max(abs(x1-x2),abs(y2-y1))==1. 
取值二:CV_CHAIN_APPROX_SIMPLE 
       仅保存轮廓的拐点信息,把所有轮廓拐点保存至contours向量内,拐点与拐点之间直线段上的信息点不予保留

官方解释为:CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal segments and leaves only their end points. For example, an up-right rectangular contour is encoded with 4 points. 
翻译过来为:压缩水平方向、垂直方向和对角线方向的中间点,只保留某个方向的终点坐标,例如一个矩形轮廓只需4个点来保持轮廓信息。
取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

官方解释为:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS applies one of the flavors of the Teh-Chin chain approximation algorithm. See [TehChin89] for details. 
翻译过来为:使用The-Chinl链逼近算法中的一个

 参数6    offset :Point类型,轮廓相对于原轮廓的偏移量

本篇学习笔记,答谢以下两位作者:(第一个链接包含官方解释及翻译,第二个链接包含部分宏名的效果图及一些比较好理解的解释方式。

利用OpenCV的函数findContours()和函数drawContours()进行轮廓的检测与绘制_昊虹图像算法的博客-CSDN博客

findContours函数参数详解_-牧野-的博客-CSDN博客_findcontours函数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989768.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号