標籤:ems one free lag 讀取 type first row cve
動態結構序列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);
OpenCV——CvSeq動態結構序列