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

这篇具有很好参考价值的文章主要介绍了学习笔记: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<vector<Point>>contours"一个双重向量,向量内每个元素保存了一组由连续的point点构成的点的集合的向量,每一组point点集就是一个轮廓
//hierarchy:"vector<Vec4i>hierarchy","Vec4i"是Vec<int,4>的别名,定义了一个“向量内每一个元素包含了四个int型变量”的向量
//mode:定义轮廓的检索模式

 参数1    image 

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

 参数2    contours

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

 参数3    hierarchy 

定义为  vector<vector<int,4>>hierarchy  或  vector<Vec4i>hierarchy,相当于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类型,轮廓相对于原轮廓的偏移量(    通常使用默认的值 (0,0)    )

通常以一个坐标形式 Point 的参数(40,30)出现。(40,30)意思是将轮廓向右移动40个像素,再向下移动30个像素,若数值过大可能会出现溢出报错。

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

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

findContours函数参数详解_-牧野-的博客-CSDN博客_findcontours函数文章来源地址https://www.toymoban.com/news/detail-468726.html

到了这里,关于学习笔记:C++环境下OpenCV的findContours函数的参数详解及优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS2017环境下使用C++和OpenCV获取摄像头参数的代码实战

    本文将介绍如何在VS2017环境下使用C++和OpenCV查看摄像头参数。通过使用使用OpenCV库的相关函数,获取摄像头的帧率、宽度、高度、亮度、对比度和饱和度等参数。   首先,我们需要在代码中导入OpenCV库,以便使用OpenCV的相关函数。在C++中,可以使用以下代码导入OpenCV库: 接

    2024年02月07日
    浏览(56)
  • 【C++】【Opencv】minMaxLoc()函数详解和示例

    minMaxLoc()函数 是 OpenCV 库中的一个函数,用于找到一个多维数组中的最小值和最大值,以及它们的位置。这个函数对于处理图像和数组非常有用。本文通过参数和示例详解,帮助大家理解和使用该函数。 函数原型: 参数详解: 在这个示例中,我们首先读取一张灰度图像。

    2024年02月03日
    浏览(48)
  • 【C++入门 三】学习C++缺省参数 | 函数重载 | 引用

    缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。 ①全缺省参数 ②半缺省参数 注意: 1. 半缺省参数必须从右往左依次来给出,不能间隔着给 2. 缺省参数不能在函数声明和定义中

    2024年02月06日
    浏览(43)
  • 【C++学习】C++入门 | 缺省参数 | 函数重载 | 探究C++为什么能够支持函数重载

    上一篇文章我介绍了C++该怎么学,什么是命名空间,以及C++的输入输出, 这里是传送门:http://t.csdn.cn/Oi6V8 这篇文章我们继续来学习C++的基础知识。 目录 写在前面: 1. 缺省参数 2. 函数重载 3. C++是如何支持函数重载的 写在最后: 在学习C语言的时候,如果一个函数存在参数

    2024年02月13日
    浏览(48)
  • 【C++】【Opencv】cv::Canny()边缘检测函数详解和示例

    Canny边缘检测是一种流行的边缘检测算法,由John F. Canny在1986年开发。它是一种多阶段过程,包括噪声滤波、计算图像强度的梯度、非最大值抑制以及双阈值检测。本文通过函数原型解读和示例对cv::Canny()函数进行详解,以帮助大家理解和使用。 Canny边缘检测的步骤如下: (

    2024年02月04日
    浏览(59)
  • opencv 入门学习笔记(C++)

    4.1.2 Mat 结构的使用 ​ 关于Mat类,我们首先要知道的是: (1)不必再手动为其开辟空间。 (2)不必再在不需要时立即将空间释放 总结: OpenCV 函数中输出图像的内存分配是自动完成的 使用opencv的c++结构时不需要考虑内存释放的问日 赋值运算符和拷贝构造函数 Mat B(A) 只复制

    2024年02月03日
    浏览(39)
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

    仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和

    2024年02月05日
    浏览(62)
  • 【opencv C++版本】安装和学习 ==Windows下使用VSCode配置OpenCV开发环境

    ref:https://opencv.org/releases/ ref:https://www.cnblogs.com/ticlab/p/16817542.html c_cpp_properties.json 照着ref 没安装成功,先写个二分查找把 ref:https://docs.opencv.org/4.x/df/d65/tutorial_table_of_content_introduction.html nnd,用这个ref在ubuntu20.04 上安装成功了!!!咳咳咳 ref:https://blog.csdn.net/weixin_4479667

    2024年02月14日
    浏览(54)
  • 【C++】【Opencv】cv::GaussianBlur、cv::filter2D()函数详解和示例

    本文通过函数详解和运行示例对cv::GaussianBlur和cv::filter2D()两个函数进行解读,最后综合了两个函数的关系和区别,以帮助大家理解和使用。 cv::GaussianBlur 是 OpenCV 库中的一个函数,用于对图像进行高斯模糊。高斯模糊是一种常见的图像降噪技术,它通过使用高斯函数对图像进

    2024年02月04日
    浏览(41)
  • OpenCV 学习笔记(C++)(1.4W字)

    Mat基本结构 Mat对象数据组成:头部和数据部分,头部存储图像的属性(大小、宽高、图像类型:浮点数类型、字节类型、16位整型、32位整型、双精度浮点型,通道数量和获取途径),数据部分存储所有像素值(像素点)的集合 使用赋值方法,可以将源Mat对象赋值给另一个

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包