cvCreateMemStorage//cvCreateSeq/…

来源:互联网 发布:怎样在淘宝做代销 编辑:程序博客网 时间:2024/05/18 03:38

1、CvMemStorage *storage=cvCreateMemStorage(block_size);
用来创建一个内存存储器,来统一管理各种动态对象的内存。
函数返回一个新创建的内存存储器指针。
参数block_size对应内存器中每个内存块的大小,为0时内存块默认大小为64k。


2、cvCreateSeq

CvSeq* cvCreateSeq(int seq_flags,int header_size,intelem_size,CvMemStorage* storage)
功能:创建一序列
说明:CvSeq本身就是一个可增长的序列,不是固定的序列
参数:seq_flags为序列的符号标志。如果序列不会被传递给任何使用特定序列的函数,那么将它设为0,否则从预定义的序列类型中选择一合适的类型。Header_size为序列头部的大小;必须大于或等于sizeof(CvSeq)。如果制定了类型或它的扩展名,则此类型必须适合基类的头部大小。Elem_size为元素的大小,以字节计。这个大小必须与序列类型(由seq_flags指定)相一致。
例如,对于一个点的序列,元素类型CV_SEQ_ELTYPE_POINT应当被指定,参数elem_size必须等同于sizeof(CvPoint)。Storage为指向前面定义的内存存储器.

注: 函数cvCreateSeq中的参数seq_flags可以设定为以下值中的一个。
#defineCV_SEQ_ELTYPE_POINT         CV_32SC2 
#defineCV_SEQ_ELTYPE_CODE          CV_8UC1  
#defineCV_SEQ_ELTYPE_GENERIC       0
#defineCV_SEQ_ELTYPE_PTR           CV_USRTYPE1
#defineCV_SEQ_ELTYPE_PPOINT        CV_SEQ_ELTYPE_PTR 
#defineCV_SEQ_ELTYPE_INDEX         CV_32SC1 
#defineCV_SEQ_ELTYPE_GRAPH_EDGE    
#defineCV_SEQ_ELTYPE_GRAPH_VERTEX  
#defineCV_SEQ_ELTYPE_TRIAN_ATR     
#define CV_SEQ_ELTYPE_CONNECTED_COMP 0 
#defineCV_SEQ_ELTYPE_POINT3D       CV_32FC3 
 
3、cvFindContours
 函数cvFindContours从二值图像中检索轮廓,并返回检测到的轮廓的个数。first_contour的值由函数填充返回,它的值将为第一个外轮廓的指针,当没有轮廓被检测到时为NULL。其它轮廓可以使用h_next和v_next连接,从first_contour到达。
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq**first_contour,int header_size=sizeof(CvContour), intmode=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:检索所有的轮廓,并重构嵌套轮廓的整个层次。

 

/////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////

例程:

 

 //初始化序列

 CvMemStorage *siln_contours_storage =NULL;
 CvSeq *siln_contours_seq=NULL;
 if(!siln_contours_storage)
 {
   siln_contours_storage=cvCreateMemStorage(0);

  siln_contours_seq=cvCreateSeq(0,sizeof(CvSeq),sizeof(CvContour),siln_contours_storage);
  //siln_contours_seq=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof      (CvPoint),siln_contours_storage);

  //siln_contours_seq=cvCreateSeq(0,sizeof(CvSeq),sizeof(CvRect),siln_contours_storage);
  }
 else
  cvClearMemStorage(siln_contours_storage);

  //从二值化图像中获取轮廓,存入siln_contours_seq序列中

 cvFindContours(silh,siln_contours_storage,&siln_contours_seq,sizeof(CvContour),
                 CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));

 //把获得的轮廓序列存入到rect_vector向量中

 std::vector rect_vector;
 for(;siln_contours_seq;siln_contours_seq=siln_contours_seq->h_next)
 {
    CvRectrect=((CvContour*)siln_contours_seq)->rect;
    rect_vector.push_back(rect);
 }

 cvReleaseMemStorage(&siln_contours_storage);
 cvReleaseImage(&silh);

原创粉丝点击