cvFindContours函数:
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
image:
  8比特单通道的源二值图像。非零像素作为1处理,0像素保存不变。从一个灰度图像得到二值图像的函数有:cvThreshold,cvAdaptiveThreshold和cvCanny。
storage:返回轮廓的容器。
first_contour:
  输出参数,用于存储指向第一个外接轮廓。
header_size:
  header序列的尺寸.如果选择method = CV_CHAIN_CODE, 则header_size >= sizeof(CvChain);其他,则 header_size >= sizeof(CvContour)。
mode:
  CV_RETR_EXTERNAL:只检索最外面的轮廓;
  CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
  CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
  CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。

   蓝色表示v_next,绿色表示h_next
method:
  边缘近似方法(除了CV_RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)。可取值如下:
  CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
  CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
  CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
  CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。
  CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。
offset:
  偏移量,用于移动所有轮廓点。当轮廓是从图像的ROI提取的,并且需要在整个图像中分析时,这个参数将很有用。

我的一个不知道从哪里抄来的栗子:

#include "stdafx.h"

#include "cv.h"
#include "highgui.h" #define CVX_RED CV_RGB(0xff, 0x00, 0x00)
#define CVX_GREEN CV_RGB(0x00, 0xff, 0x00)
#define CVX_BLUE CV_RGB(0x00, 0x00, 0xff) using namespace cv; int main()
{
IplImage* img_8uc1 = NULL;
cvNamedWindow("img_contour", CV_WINDOW_AUTOSIZE); if (img_8uc1 = cvLoadImage("cv38.jpg", 0))
{
IplImage* img_edge = cvCreateImage(cvGetSize(img_8uc1), 8, 1);
IplImage* img_8uc3 = cvCreateImage(cvGetSize(img_8uc1), 8, 3); cvThreshold(img_8uc1, img_edge, 128, 255, CV_THRESH_BINARY);
//对灰度图img_8uc1 像进行阈值操作得到二值图像 img_edge CvMemStorage* storage = cvCreateMemStorage();
//创建一个内存储存器 默认为 64K CvSeq* first_contour = NULL;
//创建一个动态序列指针,用其指向第一个存储轮廓单元地址 int NC = cvFindContours(
//cvFindContours从二值图像中检索轮廓,并返回检测到的轮廓的个数
img_edge,
storage, //存储轮廓元素的储存容器
&first_contour, //指向第一个输出轮廓
sizeof (CvContour),
CV_RETR_LIST //提取所有轮廓,并且放置在 list 中
); printf("Total Contours Detected: %d\n", NC); cvCvtColor(img_8uc1, img_8uc3, CV_GRAY2BGR);
//色彩空间转换,将img_8uc1 转换为BGR空间,img_8uc3 为转换后结果 int n = 0;
//用于下面轮廓的记数
for (CvSeq* c=first_contour; c!=NULL; c = c->h_next)
{ //从第一个轮廓开始遍历,直到所有轮廓都遍历结束 CvRect rect = cvBoundingRect(c,1); if (rect.height > 0 && rect.width > 0 )
{
if ( (double)rect.height / (double)rect.width > 5 || (double)rect.height / (double)rect.width < 0.2 )
{
continue ;
}
} if ( cvContourArea(c) < 20 )
{
continue ;
} cvDrawContours(
img_8uc3, //用于绘制轮廓的图像
c, //指向目前轮廓所在地址空间
CVX_RED, //外层轮廓颜色
CVX_BLUE, //内层轮廓颜色
0, //等级为0,绘制单独的轮廓
1, //轮廓线条粗细
8 //线段类型为(8邻接)连接线
); printf("Contour #%d\n", n);
//输出第 n 个轮廓 n++;
} cvShowImage("img_contour", img_8uc3);
//显示目前已绘制的轮廓图像 printf("Finished all contours. Hit ESC to finish\n"); while (cvWaitKey() != 27); cvReleaseImage(&img_edge);
cvReleaseImage(&img_8uc3);
}
cvDestroyWindow("img_contour");
cvReleaseImage(&img_8uc1);
return 0;
}

  代码注释还算仔细,我就不想多写了。

cvFindContours函数的更多相关文章

  1. 自己在总结前人经验下弄的几个opencv封装函数

    第一个是增加对比度的函数,就是变亮. IplImage* EqualizeHistColorImage(IplImage *pImage) { IplImage *pEquaImage = cvCre ...

  2. matlab函数_连通区域

    1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域.算法:(1)De ...

  3. matlab函数bwareaopen的详解

    matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下 ...

  4. 【转】matlab函数_连通区域

    转载自einyboy的博文Matlab的regionprops详解 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二 ...

  5. OpenCV 轮廓基本特征

     http://blog.csdn.net/tiemaxiaosu/article/details/51360499 OpenCV 轮廓基本特征 2016-05-10 10:26 556人阅读 评论( ...

  6. EmguCV 一些基本操作

    http://www.cnblogs.com/alsofly/p/3524866.html?utm_source=tuicool&utm_medium=referral 一.先是在程序中图像的 ...

  7. OpenCV图像轮廓检测

    轮廓检测: 轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 一.关键函数1.1  cvFindContours函数功能:对图像进行轮廓检测,这个函数将 ...

  8. 学习opencv跟轮廓相关的

    查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...

  9. MATLAB连通域标记函数

    L = bwlabel(BW,n)返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1.2.num(连通区域的个数).n的值为4或8,表示是按4连通寻找区域,还是 ...

随机推荐

  1. win7下设置smtp的方法

    在win7中开启SMTP服务的方法如下: 1. 首先确定是否开启IIS服务:在运行中输入“inetmgr”,若提示出错,则表明未安装.进入步骤2,否则进入步骤3: 2.打开控制面板->程序-&g ...

  2. shader练习-vertphone

    Shader "VertPhone" { Properties { _MainTex( "颜色贴图", 2D ) = "white"{} _ ...

  3. TI C66x DSP 系统events及其应用 - 5.7(IST)

    当CPU開始处理一个中断(INT4~15)时,它将引用中断服务表(IST).IST是一个获取包括中断服务代码的包的表. IST包括16个连续的获取包.每个中断服务获取包(ISFP)包括最多14条指令( ...

  4. ORACLE性能优化- Buffer cache 的调整与优化

    Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的 free buffer waits事件. 下面将具 ...

  5. BioinfomaticsPPT-1-Introduction

    1.人类基因基础  2.基因组规模 3.基因分化表达 4.遗传信息流 5.基因基础知识相关 6.遗传编码 7.序列比对的意义 8.

  6. pandas(九)数据转换

    移除重复数据 dataframe中常常会出现重复行,DataFrame对象的duplicated方法返回一个布尔型的Series对象,可以表示各行是否是重复行.还有一个drop_duplicates方 ...

  7. Oracle Shared Pool 原理

    Oracle Shared Pool 原理 由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构,library cache latch, ...

  8. Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数 //字符串分割: Split var   reg: TPerlRegEx;   List: TStrings; ...

  9. 数据库权限分配(远程共享数据库)(mysql)

    1. 数据库远程权限 mysql -uroot -proot grant all privileges on formal.* to root@'192.168.3.40' identified by ...

  10. ununtu16.04+python3+selenium+firefox环境搭建

    一.初始配置: 1.安装完系统并配置好地址及DNS.2.设置root密码: sudo passwd root 3.更改云源: sudo cp /etc/apt/sources.list /etc/ap ...