OpenCV中文网站例程——轮廓检测(只检测图像的外部轮廓)

CvMemStorage
CvMemStorage *storage=cvCreateMemStorage(block_size);
用来创建一个内存存储器,来统一管理各种动态对象的内存。
函数返回一个新创建的内存存储器指针。
参数block_size对应内存器中每个内存块的大小,为0时内存块默认大小为64k。
 
strcmp
extern int strcmp(const char *s1,const char * s2);
当s1<s2时,返回为负数 注意不是-1
当s1==s2时,返回值= 0
当s1>s2时,返回正数 注意不是1
 
cvFindContours
从二值图像中检索轮廓,并返回检测到的轮廓的个数。first_contour的值由函数填充返回,它的值将为第一个外轮廓的 指针 ,当没有轮廓被检测到时为NULL。其它轮廓可以使用h_next和v_next连接,从first_contour到达。
 
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提取的,并且需要在整个图像中分析时,这个参数将很有用。
 
 
cvDrawContours
cvDrawContours在 图像上绘制外部和内部轮廓。当thickness >= 0 时,绘制轮廓线;否则填充由轮廓包围的部分。
void cvDrawContours(     CvArr *img,           CvSeq* contour,
                                                 CvScalar external_color,       CvScalar hole_color,
                                                 int max_level,            int thickness=1,
                                                 int line_type=8,         CvPoint offset=cvPoint(0,0)   );
img
要在其上绘制轮廓的图像。和在其他绘图函数里一样,轮廓是ROI的修剪结果。
contour
指向第一个轮廓的 指针
external_color
外轮廓的颜色。
hole_color
内轮廓的颜色。
max_level
画轮廓的最大层数。如果是0,只绘制contour;如果是1,将绘制contour后和contour同层的所有轮廓;如果是2,绘制contour后所有同层和低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。
thickness
绘制轮廓线的宽度。如果为负值(例如,等于CV_FILLED),则contour内部将被绘制。
line_type
轮廓线段的类型,具体查看cvLine的描述。
offset
按给定值移动所有点的坐标
 
 
例子结果:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
程序:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
 
int main( int argc, char** argv )
{
  //声明IplImage指针
  IplImage* pImg = NULL;
  IplImage* pContourImg = NULL;
 
 
  CvMemStorage * storage = cvCreateMemStorage(0);//创建内存块大小为64k
  CvSeq * contour = 0;
 int mode = CV_RETR_EXTERNAL;

if( argc == 3)
    if(strcmp(argv[2], "all") == 0)
    mode = CV_RETR_CCOMP; //内外轮廓都检测
 
 
  //创建窗口
  cvNamedWindow("src", 1);
  cvNamedWindow("contour",1);
 
 
  //载入图像,强制转化为Gray
 if( (pImg = cvLoadImage( "E:\\Lena.jpg", 0)) != 0 )
    {
      cvShowImage( "src", pImg );
      //为轮廓显示图像申请空间

      //3通道图像,以便用彩色显示
      pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
      //复制原图像并转为 BGR图像
      cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);
 
      //查找contour
      cvFindContours( pImg, storage, &contour, sizeof(CvContour),
    mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
 
    }
  else
    {
      //销毁窗口
      cvDestroyWindow( "src" );
      cvDestroyWindow( "contour" );
      cvReleaseMemStorage(&storage);
 
      return -1;
    }
 
  //将轮廓画出   
  cvDrawContours(pContourImg, contour,            //前者为图像,后者为指向第一个轮廓的指针
   CV_RGB(0,0,255), CV_RGB(255, 0, 0),      //外轮廓蓝色,内轮廓红色
   2, 2, 8, cvPoint(0,0));                  //绘制contour后所有同层和低一层的轮廓,以此类推,线宽为2,线段类型为8,偏移坐标为(0,0)
  //显示图像
  cvShowImage( "contour", pContourImg );
 
  cvWaitKey(0);
 
  //销毁窗口
  cvDestroyWindow( "src" );
  cvDestroyWindow( "contour" );
  //释放图像
  cvReleaseImage( &pImg );
  cvReleaseImage( &pContourImg );
  cvReleaseMemStorage(&storage);
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值