CvSeq

翻译 2012年03月29日 02:13:18

CvSeq

可增长的元素序列

#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()头中:

标准的序列元素类型:

#define CV_SEQ_ELTYPE_POINT          CV_32SC2  /* (x,y) */
#define CV_SEQ_ELTYPE_CODE           CV_8UC1   /* freeman code: 0..7 */
#define CV_SEQ_ELTYPE_GENERIC        0 /* unspecified type of
                                        sequence elements */

#define CV_SEQ_ELTYPE_PTR            CV_USRTYPE1 /* =6 */
#define CV_SEQ_ELTYPE_PPOINT         CV_SEQ_ELTYPE_PTR  /* &elem: pointer to
                                                element of other sequence */

#define CV_SEQ_ELTYPE_INDEX          CV_32SC1  /* #elem: index of element of
                                                      some other sequence */

#define CV_SEQ_ELTYPE_GRAPH_EDGE     CV_SEQ_ELTYPE_GENERIC  /* &next_o,
                                                  &next_d, &vtx_o, &vtx_d */

#define CV_SEQ_ELTYPE_GRAPH_VERTEX   CV_SEQ_ELTYPE_GENERIC  /* first_edge,
                                                                   &(x,y) */

#define CV_SEQ_ELTYPE_TRIAN_ATR      CV_SEQ_ELTYPE_GENERIC  /* vertex of the
                                                            binary tree   */

#define CV_SEQ_ELTYPE_CONNECTED_COMP CV_SEQ_ELTYPE_GENERIC  /* connected
                                                               component  */

#define CV_SEQ_ELTYPE_POINT3D        CV_32FC3  /* (x,y,z)  */

后面的CV_SEQ_KIND_BITS位表示了序列的种类。

标准的序列种类有:

/* generic (unspecified) kind of sequence */
#define CV_SEQ_KIND_GENERIC     (0 << CV_SEQ_ELTYPE_BITS)

/* dense sequence suntypes */
#define CV_SEQ_KIND_CURVE       (1 << CV_SEQ_ELTYPE_BITS)
#define CV_SEQ_KIND_BIN_TREE    (2 << CV_SEQ_ELTYPE_BITS)

/* sparse sequence (or set) subtypes */
#define CV_SEQ_KIND_GRAPH       (3 << CV_SEQ_ELTYPE_BITS)
#define CV_SEQ_KIND_SUBDIV2D    (4 << CV_SEQ_ELTYPE_BITS)
剩下的位用来指定有不同特征的包括序列种类和元素类型。比如说曲线点(CV_SEQ_KIND_CURVE|CV_SEQ_ELTYPE_POINT),连同标识CV_SEQ_FLAG_CLOSED,就属于类型CV_SEQ_POLYGON或者再加上其他标识。很多处理轮廓的函数要做类型检查,如果不支持该类型就会报错。文件cvtypes.h存储了所有支持预定义类型的序列类型以及获得序列的其他属性的宏定义的完整列表。序列块的地组合快可以再在下面找到。

CvSeq类型在cvFindContours()中的使用

一.cvFindContours()函数实例 图像分割是图像处理中算是比较核心的部分了,就图像分割方法很多但也很灵活,切忌拘泥于一种算法而套用。图像分割的主要应用是利用一些特性从复杂环境中把需要...
  • polly_yang
  • polly_yang
  • 2013年03月05日 18:46
  • 7752

Opencv中CvSeq的理解

简介轮廓是由一个一个像素组成的,如何在内存中存储一个轮廓,就需要用到序列(CvSeq)结构,另外,在处理任何有序关系的动态的对象时可以用到CvSeq。序列是某种结构的链表,可以将序列想象为许多编程语言...
  • CHIERYU
  • CHIERYU
  • 2015年11月30日 15:37
  • 1553

opencv中CvSeq的用法

最近遇到了Opencv中的CvSeq结构的用法,由于我基础较差,刚开始看不懂,不得不花时间去查阅,如果分析的不对还请大家指出来! CvSeq结构在Opencv中的源码如下面所示: #define ...
  • gxiaob
  • gxiaob
  • 2013年03月04日 11:14
  • 4623

opencv序列结构CvSeq和轮廓提取cvFindContours的简单运用

我们检测出输入图像的轮廓,然后逐个绘制每个轮廓。从这个例子中,我们可以了解到轮廓测量的方法(如代码中是CV_RETR_LIST)以及max_depth(代码中是0)等参数的细节。如果设置的max_de...
  • gdut2015go
  • gdut2015go
  • 2015年06月13日 22:21
  • 2068

序列数据结构 (CvSeq)

序列是内存存储器中可以存储的一种对象。在opencv中,序列可以存储多种不同的结构。你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).序列在内存被实现为一个双端队...
  • qingdan7135
  • qingdan7135
  • 2016年11月12日 15:09
  • 130

opencv创建序列cvCreateSeq与插入元素cvSeqPush的运用

序列在内部其实对应一个双端序列。因此,我们可以高效地从序列的任意一端(开头和结尾)访问序列。这样我们可以很自然地将序列做一个栈使用。与CvSeq结构一起使用,下面六个函数可将序列封装成一个栈(准确来说...
  • gdut2015go
  • gdut2015go
  • 2015年06月14日 21:26
  • 2126

OpenCV的序列数据结构(CvSeq)

序列是内存存储器中可以存储的一种对象.序列是某种结构的链表.OpenCV中,序列可以存储多种不同的结构.你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).学列在内...
  • NewThinker_wei
  • NewThinker_wei
  • 2015年04月23日 16:38
  • 3844

cvSeq的用法说明

openCV中 cvSeq的用法说明 http://blog.csdn.net/wqvbjhc/archive/2010/04/17/5497017.aspx ------------------...
  • PhoenixTree2013
  • PhoenixTree2013
  • 2013年02月21日 13:39
  • 224

OpenCV学习笔记(六)—序列

序列是内存存储器中可以存储的一种对象.序列是某种结构的链表.OpenCV中,序列可以存储多种不同的结构.你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).学列在内...
  • cc7829290
  • cc7829290
  • 2013年05月09日 17:07
  • 2132

Opencv中CvSeq的理解 [转载]

原文:http://blog.csdn.net/chieryu/article/details/50113263 简介 轮廓是由一个一个像素组成的,如何在内存中存储一个轮廓,就需要用到序列(CvS...
  • yarina
  • yarina
  • 2016年08月03日 16:15
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CvSeq
举报原因:
原因补充:

(最多只允许输入30个字)