动态结构序列CvSeq是所有OpenCV动态数据结构的基础。
分为两类:
- 稠密序列
- 稀疏序列
(1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 — 向量、栈、队列和双端队列。数据间不存在空隙(连续存储)。如果元素元素从序列中间被删除或插入新的元素到序列,那么此元素后边的相关元素全部被移动。
(2)稀疏序列派生自CvSet,CvSet也是基于CvSeq的,他们都是由节点所组成,每一个节点要么被占用,那么为空,由标志位flag决定。这些序列作为无序数据结构被使用,如点集合、图、Hash表等。
CvSeq的定义如下:
<span style="color:#ff0000; font-style:italic">/* Read/Write sequence. Elements can be dynamically inserted to or deleted from the sequence. */</span> <span style="color:#339900">#define CV_SEQUENCE_FIELDS() CV_TREE_NODE_FIELDS(CvSeq); int total; /* Total number of elements. */ int elem_size; /* Size of sequence element in bytes. */ schar* block_max; /* Maximal bound of the last block. */ schar* ptr; /* Current write pointer. */ int delta_elems; /* Grow seq this many at a time. */ CvMemStorage* storage; /* Where the seq is stored. */ CvSeqBlock* free_blocks; /* Free blocks list. */ CvSeqBlock* first; /* Pointer to the first sequence block. */</span> <span style="color:#00ff00">typedef</span> <span style="color:#00ff00">struct</span> CvSeq <span style="color:#080000">{</span> CV_SEQUENCE_FIELDS<span style="color:#080000">(</span><span style="color:#080000">)</span> <span style="color:#080000">}</span> CvSeq<span style="color:#080800">;</span>
/* total表示稠密序列的元素个数,或者稀疏序列被分配的节点数。 elem_size表示序列中每个元素占用的字节数。 block_max是最近一个内存的最大边界指针。 ptr表示当写指针。 delta_elems表示序列间隔尺寸。 storage指向序列存储的内存块的指针。 free_blocks表示空的块列表。 first指向第一个序列块。 h_next和h_prev并不是指向CvSeq内部元素的指针,它们是指向其它CvSeq的。 */
有关CvSeq的函数
//创建序列 CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage) //复制序列 CvSeq* cvCloneSeq(const CvSeq* seq,CvMemStorage* storage=NULL) //逆序序列 Void cvSeqInvert(CvSeq* seq) //序列排序 Void cvSeqSort(CvSeq* seq,CvCmpFunc func,void *userdata=NULL) //查询元素 Char* cvSeqSearch(CvSeq* seq,const void* elem,CvCmpFunc func,int is_sorted,int *elem_idx,void *userdata=NULL) //清空序列 Void cvClearSeq(CvSeq* seq);
//添加删除元素 //尾部添加 Char* cvSeqPush(CvSeq* seq,void* element=NULL); //尾部删除 void cvSeqPop(CvSeq* seq,void* element=NULL); //头部添加 Char* cvSeqPushFront(CvSeq* seq,void* element=NULL); //头部删除 Void cvSeqPopFront(CvSeq* seq,void* element=NULL); //添加多个元素 Void cvSeqPushMulti(CvSeq* seq,void* elements,int count,int in_front=0); //删除多个元素 Void cvSeqPopMulti(CvSeq* seq,void* elements,int count,int in_front=0); //指定位置添加元素 Char* cvSeqInsert(CvSeq* seq,int before_index,void* element=NULL); //指定位置删除元素 Void cvSeqRemove(CvSeq* seq,int index);
//返回指定元素的指针 Char* cvGetSeqElem(const CvSeq* seq,int index); //返回元素索引 Int cvSeqElemIdx(const CvSeq* seq,const void* element,CvSeqBlock** block=NULL); //写入序列 Void cvStartAppendToSeq(CvSeq* seq,CvSeqWriter* writer); //创建并初始化 Void cvStartWriteSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage,CvSeqWriter* writer); //完成写入操作 CvSeq* cvEndWriteSeq(CvSeqWriter* writer); //初始化序列中读取过程 Void cvStartReadSeq(const CvSeq* seq,CvSeqReader* reader,int reverse=0);