findContours()函数

函数原型

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

参数1:单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像;

参数2:contours定义为“vector<vector<Point>> contours”,是一个双重向量(向量内每个元素保存了一组由连续的Point构成的点的集合的向量),每一组点集就是一个轮廓,有多少轮廓,contours就有多少元素;

参数3:hierarchy定义为“vector<Vec4i> hierarchy”,Vec4i的定义:typedef Vec<int, 4> Vec4i;(向量内每个元素都包含了4个int型变量),所以从定义上看,hierarchy是一个向量,向量内每个元素都是一个包含4个int型的数组。向量hierarchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy内每个元素的4个int型变量是hierarchy[i][0] ~ hierarchy[i][3],分别表示当前轮廓 i 的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号索引。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓,则相应的hierarchy[i][*]被置为-1。

参数4:定义轮廓的检索模式,取值如下:

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

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

CV_RETR_CCOMP: 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层;

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

参数5:定义轮廓的近似方法,取值如下:

CV_CHAIN_APPROX_NONE:保存物体边界上所有连续的轮廓点到contours向量内;

CV_CHAIN_APPROX_SIMPLE:仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留;

CV_CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法;

CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法。

参数6:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值

下边用效果图对比一下findContours函数中参数4和参数5取不同值时,向量contours和hierarchy的内容如何变化,有何异同。

一、mode取值“CV_RETR_EXTRERNAL”,method取值“CV_CHAIN_APPROX_NONE”,即只检测最外层轮廓,并且保存轮廓上所有点:

只有最外层轮廓,内层轮廓被忽略

Contours向量内所有点集:保存了所有轮廓上的所有点,图像表现跟轮廓一致

原文地址:https://www.cnblogs.com/GaloisY/p/11062065.html

时间: 2024-08-13 14:22:42

findContours()函数的相关文章

OpenCV示例学习笔记(1)-contours2.cpp-通过findContours 函数实现轮廓提取

这个系列的目的是通过对OpenCV示例,进一步了解OpenCV函数的使用,不涉及具体原理. 示例代码地址:http://docs.opencv.org/3.0.0/examples.html(安装openCV时可框选) 目录 简介 Example运行截图 Example分析 Example代码 简介 本文记录了对OpenCV示例contours2.cpp的分析. 资料地址:http://docs.opencv.org/3.0.0/d0/d2a/contours2_8cpp-example.htm

[转载]findContours函数参数说明及相关函数

findContours函数,这个函数的原型为: void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierar-chy, int mode, int method, Point offset=Point()) 参数说明 输入图像image必须为一个2值单通道图像 contours参数为检测的轮廓数组,每一个轮廓用一个point类型的vector表示 hiararchy参数和轮廓

findContours函数导致崩溃

在程序中使用: findContours(grayImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); 后导致程序崩溃,将该语句屏蔽后,程序并没有问题. 同样打开的另外一个工程使用该语句没有问题.将没有问题的语句拷贝到该工程下,同样出错. 解决方案: 在配置属性->常规->MFC的使用中,将在静态库中使用MFC改为在共享DLL中使用MFC. 参考资料:http://bbs.csd

Opencv-python 找到图像轮廓并绘制,cv2.findContours()函数,求轮廓外接矩形,cv2.boundingrect()

一.查找图像轮廓 opencv-python中查找图像轮廓的API为:findContours函数 该函数接受二值图作为参数,根据参数,可查找物体外轮廓.内外轮廓,保存轮廓点.压缩等等... 如:contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) def findContours(image, mode, method, contours=None, hierarchy=None

opencv cv.findContours 函数详解 图像轮廓层级 图像轮廓检索方式详解

函数 cv.findContours contours, hierarchy = cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] ) 参数1:源图像 参数2:轮廓的检索方式,这篇文章主要讲解这个参数 参数3:一般用 cv.CHAIN_APPROX_SIMPLE,就表示用尽可能少的像素点表示轮廓 contours:图像轮廓坐标,是一个链表 hierarchy:[Next, Previous, First

OpenCV中的新函数connectedComponentsWithStats使用

主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域. 关键字    :connectedComponentsWithStats 在以前,常用的方法是"是先调用 cv::findContours() 函数(传入cv::RETR_CCOMP 标志),随后在得到的连通区域上循环调用 cv::drawContours() " 比如,我在GOCVHelper中这样进行了实现 //寻找最大的轮廓 VP FindBigestContour(Mat src){ int ima

Opencv关于findcontours中断问题

本人是VS2012+CV3.0,最近几天需要用到findcontours函数,但是缺总是遇到中断和  (xxxx.dll)什么访问不了,总之就是百度到的是堆栈问题.通过百度各种解决就是不行. 以下提供三个办法:1.按照百度的各种办法试一试,如果不行就看第二种方法. 2.环境配置错误:先检查库目录和 X86  X64的选择是否错误,   再看V11  V12 之类的是否选错. ( V11-VS2012    V12-VS2013 其他版本百度自行查询). 3.这个也是我遇到问题解决的办法:说到底还

指针*和取地址&amp;函数输入使用

函数输入问题: 1 带&和不带& (参数本身还是拷贝一份参数) 2 函数输入指针 #include <iostream> using namespace std; int main( ) { void swap(int *p1,int *p2); //函数声明 int *pointer_1,*pointer_2,a,b; //定义指针变量pointer_1,pointer_2,整型变量a,b cin>>a>>b; pointer_1=&a; //

[opencv]findcoutours函数使用

轮廓是定义或限定形状或对象的边或线,是机器视觉中的常用的概念,多用于目标检测.识别等任务. 关于OpenCV轮廓操作,尤其是级别及如何使用轮廓级别进行筛选等问题,相关文章比较少,正好最近用到,因此将其总结成文. 本文主要介绍OpenCV的查找轮廓函数findContours()绘制函数drawContours(),及其轮廓级别参数hierarchy,涉及到预处理.轮廓筛选等内容,并提供全部源代码,希望能帮助大家理解基本概念并能借鉴示例代码编写自己的算法. 本文代码:C++ 本文包括如下内容: 基