【opencv】CvSeq數據結構及函數

可動態增長元素序列(OpenCV_1.0已發生改變,詳見cxtypes.h) Growable sequence of elements

#define CV_SEQUENCE_FIELDS() \
    int flags; /* micsellaneous flags */ \
    int header_size; /* size of sequence header */ \
    struct CvSeq* h_prev; /* previous sequence */ \
    struct CvSeq* h_next; /* next sequence */ \
    struct CvSeq* v_prev; /* 2nd previous sequence */ \
    struct CvSeq* v_next; /* 2nd next sequence */ \
    int total; /* total number of elements */ \
    int elem_size;/* size of sequence element in bytes */ \
    char* block_max;/* maximal bound of the last block */ \
    char* ptr; /* current write pointer */ \
    int delta_elems; /* how many elements allocated when the sequence grows (sequence granularity) */ \
    CvMemStorage* storage; /* where the seq is stored */ \
    CvSeqBlock* free_blocks; /* free blocks list */ \
    CvSeqBlock* first; /* pointer to the first sequence block */


typedef struct CvSeq
{
    CV_SEQUENCE_FIELDS()
} CvSeq;

結構CvSeq是所有OpenCV動態數據結構的基礎。 在1.0版本中,將前六個成員剝離出來定義成一個宏. 通過不同尋常的宏定義簡化了帶有附加參數的結構 CvSeq 的擴展。爲了擴展 CvSeq, 用戶可以定義一新的數據結構或在通過宏CV_SEQUENCE_FIELDS()所包括的 CvSeq 的域後在放入用戶自定義的域。

有兩種類型的序列 -- 稠密序列和稀疏序列。稠密序列都派生自 CvSeq, 它們用來代表可擴展的一維數組 -- 向量,棧,隊列,雙端隊列。數據間不存在空隙(即:連續存放)-- 如果元素從序列中間被刪除或插入新的元素到序列中(不是兩端),那麼此元素後邊的相關元素會被移動。稀疏序列都派生自 CvSet,後面會有詳細的討論。它們都是由節點所組成的序列,每一個節點要麼被佔用空間要麼是空,由 flag 標誌指定。這些序列作爲無序的數據結構而被使用,如點集,圖,哈希表等。

域 header_size(結構的大小) 含有序列頭部節點的實際大小,此大小大於或等於 sizeof(CvSeq).當這個宏用在序列中時,應該等於 sizeof(CvSeq),若這個宏用在其他結構中,如CvContour,結構的大小應該大於sizeof(CvSeq); 域 h_prev, h_next, v_prev, v_next 可用來創建不同序列的層次結構。域 h_prev, h_next 指向同一層次結構前一個和後一個序列,而域 v_prev, v_next指向在垂直方向上的前一個和後一個序列,即:父親和子孫。

域 first 指向第一個序列快,塊結構在後面描述。

域 total 包含稠密序列的總元素數和稀疏序列被分配的節點數。

域 flags 的高16位描述(包含)特定的動態結構類型(CV_SEQ_MAGIC_VAL 表示稠密序列,CV_SET_MAGIC_VAL 表示稀疏序列),同時包含形形色色的信息。

低 CV_SEQ_ELTYPE_BITS 位包含元素類型的 ID(標示符)。大多數處理函數並不會用到元素類型,而會用到存放在 elem_size 中的元素大小 。如果序列中包含 CvMat 中的數據,那麼元素的類型就與 CvMat 中的類型相匹配, 如:CV_32SC2 可以被使用爲由二維空間中的點序列, CV_32FC1用爲由浮點數組成的序列等。通過宏 CV_SEQ_ELTYPE(seq_header_ptr) 來獲取序列中元素的類型。處理數字序列的函數判斷: elem.size 等同於序列元素的大小。除了與 CvMat 相兼容的類型外,還有幾個在頭 cvtypes.h 中定義的額外的類型。

函數原型 說明
CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage) 功能:創建一序列 

參數:seq_flags爲序列的符號標誌。如果序列不會被傳遞給任何使用特定序列的函數,那麼將它設爲0,否則從預定義的序列類型中選擇一合適的類型。 Header_size爲序列頭部的大小;必須大於或等於sizeof(CvSeq)。如果制定了類型或它的擴展名,則此類型必須適合基類的頭部大小。 Elem_size爲元素的大小,以字節計。這個大小必須與序列類型(由seq_flags指定)相一致。例如,對於一個點的序列,元素類型 CV_SEQ_ELTYPE_POINT應當被指定,參數elem_size必須等同於sizeof(CvPoint)。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)

功能:初始化序列中的讀取過程




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章