提取并显示图像轮廓

提取并显示图像轮廓

01 #include <cv.h>
02 #include <cxcore.h>
03 #include <highgui.h>
04 #include <iostream.h>
05 void main()
06 {
07 int i=0;
08 int mode=CV_RETR_CCOMP;        //提取轮廓的模式
09 int contoursNum=0;            //提取轮廓的数目
10 CvScalar externalColor;
11 CvScalar holeColor;
12 CvMemStorage * storage=cvCreateMemStorage(0);    //提取轮廓需要的储存容量 0为默认64KB
13 CvSeq * pcontour=0;  //提取轮廓的序列指针
14 IplImage * pImg=NULL;
15 IplImage * pContourImg=NULL;
16 IplImage * src=cvLoadImage("pic3.png",-1);
17 pImg=cvCreateImage(cvGetSize(src),src->depth,1);
18 pContourImg=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
19 cvCvtColor(src,pImg,CV_RGB2GRAY);    //将图像转换为灰度
20 cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
21 cvNamedWindow("pcontour",CV_WINDOW_AUTOSIZE);
22 cvShowImage("src",src);
23 cvThreshold(pImg,pImg,180,255,CV_THRESH_BINARY);    //二值化
24 //--------------查找轮廓----------------
25 mode=CV_RETR_LIST;
26 contoursNum=cvFindContours(pImg,storage,&  pcontour,sizeof(CvContour),mode,CV_CHAIN_APPROX_NONE);
27 cout<<contoursNum<<" "<<endl;
28 //--------------画轮廓----------------
29 for (;pcontour!=0;pcontour=pcontour->h_next)
30 {
31 holeColor=CV_RGB(rand()&255,rand()&255,rand()&255);
32 externalColor=CV_RGB(rand()&255,rand()&255,rand()&255);
33 cvDrawContours(pContourImg,pcontour,externalColor,holeColor,1,2,8);
34 }
35 cvShowImage("pcontour",pContourImg);
36 cvWaitKey(0);
37 cvReleaseImage(&src);
38 cvReleaseImage(&pImg);
39 cvReleaseImage(&pContourImg);
40 }==========================================================

==========================================================
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 ōffset=cvPoint(0,0) );

image 输入的 8-比特、单通道图像。为了从灰度图像中得到这样的二值图像,可以使用 cvThreshold、cvAdaptiveThreshold 或 cvCanny,改变输入图像内容。

storage 得到的轮廓的存储容器 first_contour 输出参数:包含第一个输出轮廓的指针 header_size 如果 method=CV_CHAIN_CODE,则序列头的大小 >=sizeof(CvChain),否则 >=sizeof(CvContour)。

mode 提取模式:
CV_RETR_EXTERNAL - 只提取最外层的轮廓; 
CV_RETR_LIST - 提取所有轮廓,并且放置在 list 中; 
CV_RETR_CCOMP - 提取所有轮廓,并且将其组织为两层的 hierarchy: 顶层为连通域的外围边界,次层为洞的内层边界;
CV_RETR_TREE - 提取所有轮廓,并且重构嵌套轮廓的全部 hierarchy; 

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 - 应用 Teh-Chin 链逼近算法;
CV_LINK_RUNS - 通过连接为 1 的水平碎片使用完全不同的轮廓提取算法;

offset 每一个轮廓点的偏移量,当轮廓是从图像 ROI 中提取出来的时候,使用偏移量有用,因为可以从整个图像上下文来对轮廓做分析。

函数 cvFindContours 从二值图像中提取轮廓,并且返回提取轮廓的数目。

指针 first_contour 的内容由函数填写。它包含第一个最外层轮廓的指针,如果指针为 NULL,则没有检测到轮廓(比如图像是全黑的)。其它轮廓可以从 first_contour 利用 h_next 和 v_next 链接访问到。

在 cvDrawContours 的样例显示如何使用轮廓来进行连通域的检测。

源文地址:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值