序列数据结构 (CvSeq)

来源:互联网 发布:php教材推荐 编辑:程序博客网 时间:2024/06/08 12:21

  序列是内存存储器中可以存储的一种对象。在opencv中,序列可以存储多种不同的结构。你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).序列在内存被实现为一个双端队列(deque).因此序列可以实现快速的随机访问,已经快速删除顶端的元素,但是从中间删除元素则稍慢些.

 结构CvSeq的定义

typeedef struct CvSeq{int flags; /* 标识. */ int header_size; /* 序列头的大小 */ 
CvSeq* h_prev; /* 水平方向上的前一个序列 */
CvSeq* h_next; /* 水平方向上的下一个序列 */
CvSeq* v_prev; /*垂直方向上的上一个序列 */
CvSeq* v_next /* 垂直方向上的下一个序列 */ 
int total; /* 元素总和 */
int elem_size; /* 序列元素的大小,用字节表示 */ 
 schar* block_max; /* 最后块的最大区间 */ 
schar* ptr; /* 写指针的当前位置 */ 
int delta_elems; /* 当序列增长时有多少元素需要重新分配(序列的粒度). */
 CvMemStorage* storage; /* Where the seq is stored. */ 
CvSeqBlock* free_blocks; /* 自由块列表 */ 
 CvSeqBlock* first; /* 指向第一个块的指针 */ 
}
序列中有一些重要的属性,首先,最常用到的是total成员,total存储序列中保存数据的个数。
其次是h_prev,h_next,v_prev和v_next,他们是CV_TREE_NODE_FIELDS的一部分,指向其他的序列(分别为上下左右四个方向)。
这四个指针不是用来访问序列中的元素,而是用来链接不同的序列。仅仅使用h_prev,h_next,可实现一个简单的链表。
另外两个变量v_prev和v_next可用来创建那些比较密切的复杂的拓扑结构。
通过这四个变量,函数cvFingdeContours可以将图像中复杂的轮廓构造为轮廓树。
                                             
0 0