opencv之內存存儲器——CvMemStorage與CvSeq


1、CvMemStorage *storage=cvCreateMemStorage(block_size);
用來創建一個內存存儲器,來統一管理各種動態對象的內存。
函數返回一個新創建的內存存儲器指針。
參數block_size對應內存器中每個內存塊的大小,為0時內存塊默認大小為64k。
 
2、cvCreateSeq
CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)
功能:創建一序列
說明:CvSeq本身就是一個可增長的序列,不是固定的序列
參數:
seq_flags為序列的符號標志。如果序列不會被傳遞給任何使用特定序列的函數,那么將它設為0,否則從預定義的序列類型中選擇一合適的類型。
Header_size為序列頭部的大小;必須大於或等於sizeof(CvSeq)。如果制定了類型或它的擴展名,則此類型必須適合基類的頭部大小。
Elem_size為元素的大小,以 字節計。這個大小必須與序列類型(由seq_flags指定)相一致。
例如,對於一個點的序列,元素類型 CV_SEQ_ELTYPE_POINT應當被指定,參數elem_size必須等同於sizeof(CvPoint)。Storage為指向前面定義的內存存儲器.
 

動態結構序列CvSeq是所有OpenCV動態數據結構的基礎。有兩種類型的序列:稠密序列,稀疏序列:

(1) 稠密序列都派生自CvSeq,他們用來代表可擴展的一維數組 — 向量、棧、隊列和雙端隊列。數據間不存在空隙(連續存儲)。如果元素元素從序列中間被刪除或插入新的元素到序列,那么此元素后邊的相關元素全部被移動。

(2)稀疏序列派生自CvSet,CvSet也是基於CvSeq的,他們都是由節點所組成,每一個節點要么被占用,那么為空,由標志位flag決定。這些序列作為無序數據結構被使用,如點集合、圖、Hash表等。

 

結構CvSeq的具體定義如下:

#define CV_SEQUENCE_FIELDS()                                            \
    CV_TREE_NODE_FIELDS(CvSeq);                                         \
    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 seq grows */  \
    CvMemStorage* storage;    /* where the seq is stored */             \
    CvSeqBlock* free_blocks;  /* free blocks list */                    \
    CvSeqBlock* first; /* pointer to the first sequence block */

total表示稠密序列的元素個數,或者稀疏序列被分配的節點數。

elem_size表示序列中每個元素占用的字節數。

block_max是最近一個內存的最大邊界指針。

ptr表示當寫指針。

delta_elems表示序列間隔尺寸。

storage指向序列存儲的內存塊的指針。

free_blocks表示空的塊列表。first指向第一個序列塊。

 
 主要功能函數:

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)
功能:初始化序列中的讀取過程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM