热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:opencvfindContours函数

本文由编程笔记#小编为大家整理,主要介绍了opencv findContours函数相关的知识,希望对你有一定的参考价值。一、前言  findContours函数的参数在众多博客中都有详细介绍,本篇随
本文由编程笔记#小编为大家整理,主要介绍了opencv findContours函数相关的知识,希望对你有一定的参考价值。

一、前言

  findContours函数的参数在众多博客中都有详细介绍,本篇随笔主要针对个别函数参数做说明,并记录相关的输出参数的部分细节

二、函数介绍

  
  void findContours( InputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset = Point());  

  contours为获取的轮廓信息,轮廓信息定义务必是vector> 形式的

  hierarchy为层级关系,定义为vector和Mat都可以。每个轮廓有四个层级信息,分别为:上一个轮廓序号、下一个轮廓序号、子轮廓序号、父轮廓序号

  mode 官方是“轮廓检索算法的模式”,可以理解为获取怎样的层级信息

  method 轮廓近似模式

  offset

三、基本效果展示

  基本代码:

Mat img = imread("../contours.bmp",IMREAD_GRAYSCALE);
imshow(
"source img",img);
vector
> vContours;
Mat mContourShow
= Mat::zeros(img.size(),CV_8U);
findContours(img,vContours,RETR_LIST,CHAIN_APPROX_NONE);
drawContours(mContourShow,vContours,
-1,Scalar(255));
imshow(
"Contours",mContourShow);
waitKey();

  代码运行结果:      

     技术图片

四、个别参数的细节区分

  部分代码:

1 vector mHierarchy;
2 vector> vContours;
3 Mat mCOntourShow= Mat::zeros(img.size(),CV_8UC3);
4 findContours(img,vContours,mHierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point(0,0));
5 for(int i = 0; i){
6 drawContours(mContourShow,vContours,i,Scalar(0,255,255),1,LINE_8);
7 putText(mContourShow,to_string(mHierarchy[i][0]).append(",").append(to_string(mHierarchy[i][1])),vContours[i][0],FONT_HERSHEY_SCRIPT_SIMPLEX,0.5,Scalar(255,255,0),1);
8 }


  4.1 mode层级信息

技术图片 技术图片

技术图片 技术图片注:图中我打的两个数字标签为层级关系的第一个数和第二个数

  mode分别为RETR_EXTERNAL(左上)、RETR_LIST(右上)、RETR_CCOMP(左下)、RETR_TREE(右下)时

的层级关系数组分别为

1,-1,-1,-1      1,-1,-1,-1          1,-1,-1,-1          7,-1,1,-1

-1,0,-1,-1      2,0,-1,-1           4,0,2,-1           6,-1,2,0

          3,1,-1,-1           3,-1,-1,1          -1,-1,3,1

          4,2,-1,-1           -1,2,-1,1          4,-1,-1,2

          5,3,-1,-1           7,1,5,-1           -1,3,5,2

          6,4,-1,-1           6,-1,-1,4          -1,-1,-1,4

 

          7,5,-1,-1           -1,5,-1,4          -1,1,-1,0

          -1,6,-1,-1          -1,4,-1,-1          -1,0,-1,-1

RETR_EXTERNAL模式是只找最外层的轮廓

RETR_LIST模式是找到所有的轮廓,但是不提供层级关系

RETR_CCOMP模式是找到所有轮廓,层级只有两层(外轮廓和洞,洞里面再有轮廓按照外轮廓算,表现在层级关系上为:父轮廓无父轮廓,子轮廓无子轮廓),注意这里父轮廓只能指定一个子轮廓,但是多个子轮廓可以指定同一个父轮廓

RETR_TREE模式是以树状梳理所有轮廓的关系

RETR_FLOODFILL官网也没有介绍,我这里用上面的图得到的效果轮廓和层级结果也不好,这里暂时不深究了

PS:RETR_CCOMP模式可以对打了lable的图片(比如通过connectcomponent函数或者watershed函数获得的结果)进行轮廓识别

 

4.2 method拟合方法

此处我换了原图,下列图片从左到右依次为:原图、CHAIN_APPROX_NONE方法、CHAIN_APPROX_SIMPLE方法、CHAIN_APPROX_TC89_L1方法、CHAIN_APPROX_TC89_KCOS方法(点集边上的数字是点集个数)

技术图片技术图片技术图片技术图片技术图片

 

CHAIN_APPROX_NONE是不做处理

CHAIN_APPROX_SIMPLE会将直线和对角线优化掉

CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS采用了近似算法

PS:如果需要真实的点集就使用前两种方法。

 

五、其他

另外再补充几点:

1、findContours找点集,对于“洞”的轮廓是4邻域连续,对于外轮廓是16邻域连续(如下图所示),当用CHAIN_APPROX_SIMPLE简化点时,矩形洞会简化为8个点

技术图片

2、所有边界点集都是位于白色区域内的,不会因为它是洞就落在黑色区域上

 

                                                                                        代码使用opencv版本:4.1.0


p,>p,>p,>p,>

推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
author-avatar
刘哥2502908157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有