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指向第一個序列塊。