cvSeq的学习

今天在研究《学习opencv》时的一个磁盘文件读写时遇到了cvSeq这个类型,就蒙圈了:

于是查找到cvSeq这个类型:

引用:http://blog.csdn.net/gavin710/article/details/7405437

#define CVgSEQUENCE\_FIELDS () \
     int flags ;  /* micsellaneous flags */ \
     int header_size ;  /* 序列头的大小 */ \
     struct CvSeq * h_prev ;  /* 前一个序列 */ \
     struct CvSeq * h_next ;  /* 后一个序列 */ \
     struct CvSeq * v_prev ;  /* 第二级前一个序列 */ \
     struct CvSeq * v_next ;  /* 第二级后一个序列 */ \
     int total ;  /* 元素的总个数 */ \
     int elem_size ; /* 元素的尺寸 */ \
     char * block_max ; /* 上一块的最大块 */ \
     char * ptr ;  /* 当前写指针 */ \
     int delta_elems ;  /*序列中快的大小
                        (序列粒度) */
 \
    CvMemStorage * storage ;  /*序列的存储位置 */ \
    CvSeqBlock * free_blocks ;  /* 未分配的块序列 */ \
    CvSeqBlock * first ;  /* 指向第一个快序列 */

typedef  struct CvSeq
{
    CVgSEQUENCE\_FIELDS ()
} CvSeq ;
CvSeq结构是所有OpenCV的一个基本的动态数据结构。

使用者用一种不常见的通过宏定义的帮助来实现结构的定义,使CvSeq结构可扩展,增加参数。用过可以自定义一个结构,然后通过宏定义CV_SEQUENCE_FIELDS()将自己定义的结构放在CvSeq的参数后面组成一个新的结构。

有两种类型的序列:密集型、稀疏型。密集型序列的基本类型就是CvSeq,这样的序列用来表示可增长的一维数组:向量、栈,队列和双向队列。他们中间没有间隔,如果从中间插入或者删除一个元素,那么从它到离它比较近的一个终点的元素都要移动。稀疏型序列的基本类型是CvSet,这将在后面作更详细讨论,他们是一个个节点的序列,每个节点,每个可以通过节点标识来申请或者释放,这种用于无序的数据结构,例如:集合元素,图标,哈希表等等

成员header_size表示了序列头的实际尺寸,这个值大于等于sizeof(cvSeq)(译者注:因为这个序列头是可扩展的)。

成员h_prev,h_next,v_prev,v_next可以用来创造独立的序列层次结构。成员h_prev,h_next用于指向统一成的前一个和后一个序列结构,而v_prev,v_next则用来指向垂直方向上的上一个和想一个序列,也就是指向他的父节点和第一个孩子节点序列结构。但这只是一个名称,指针可以通过不同的方式使用。

成员first指针指向第一块序列块,它的结构描述如下。

成员total表示密集型序列中所包含的元素的个数,以及稀疏型序列中截个的个数。

成员flags包含了动态类型签名(稠密型:CV_SEQ_MAGIC、稀疏型:CV_SET_MAGIC)的最多16位的有关序列的各种信息的标志。在最低的CV_SEQ_ELTYPE_BITS位包含了元素的类型ID,但是大多数序列处理函数不适用元素类型而是用元素大小的slem_size位。如果一个序列包含了与CvMat类型相匹配的CvMat元素类型比如:2可用于序列二维点的CV_32SC

浮点值序列:CV_32FC1等等。可通过宏定义CV_SEQ_ELTYPE(seq_header_ptr)来检索序列中元素的类型,在用来处理计算序列元素个数的elem_size值的函数可以用到。除了兼容CvMat类型,有些元素类型定义在cvtypes.h()头中:

标准的序列元素类型:



openCV中 cvSeq的用法说明

http://blog.csdn.net/wqvbjhc/archive/2010/04/17/5497017.aspx


//

/删除当前CvSeq,如果有下一个就指向下一个CvSeq,否则清空,此处要考虑多种情况,比如要删的是第一个、是最后一个、或是队列中就这一个

/

void Delete_CvSeq(CvSeq* &contour_blackline)
{
 //删除此contour_blackline
 //CvSeq* contour_blackline=&contour_blackline_pt;
 if (!contour_blackline)
 {
  return;
 }
 CvSeq *pOldSeq = NULL;  
 pOldSeq = contour_blackline;  
 if(pOldSeq->h_prev)  
  
  if ( pOldSeq->h_next)
  {
   contour_blackline = pOldSeq->h_prev;  
   contour_blackline->h_next = pOldSeq->h_next;  
   pOldSeq->h_next->h_prev = contour_blackline;  
   contour_blackline=contour_blackline->h_next;  
   cvClearSeq( pOldSeq );
  }
  else
  {
   contour_blackline = pOldSeq->h_prev;
   contour_blackline->h_next=NULL;
   cvClearSeq( pOldSeq ); 
   contour_blackline = pOldSeq->h_next; 

  }

  
 else 
  
  if ( pOldSeq->h_next)
  {
   contour_blackline = pOldSeq->h_next;  
   contour_blackline->h_prev = NULL;  
   cvClearSeq( pOldSeq ); 

  }
  else
  {
   contour_blackline=NULL;
  }

 }

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值