1.CvMemStorage* cvCreateMemStorage(int block_size=0);
创建一个内存存储器,block_size为0表示内存块默认的大小为64K
2.void cvReleaseMemStorage(CvMemStorage** storage)
释放内存存储器的所有空间
3.void cvClearMemStorage(CvMemStorage* storage)
释放的内存返还给内存存储器,并不返还给系统
4.void* cvMemStorageAlloc(CvMemStorage* storage,size_t size)
从一个内存存储器中申请空间
5.CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)
创建序列,第一个参数为采取何种方式来组织数据,第二个为序列的头大小,通常为sizeof(CvSeq),第三个为存储的元素的大小,最后一个为指定的内存存储器,当添加元素时,从该内存存储器申请空间
6.void cvClearSeq(CvSeq* seq)
删除序列,清空序列中的所有元素,但是不会将不再使用的内存返回到内存存取器也不会释放给系统
7.char* cvGetSeqElem(seq,index)
访问序列中的某个元素
8.int cvSeqElemIdx(const CvSeq* seq,const void* element,CvSeqBlock** block=NULL)
检测一个元素是否在序列中,block不为空则存放包含所指元素的块的地址
9.CvSeq* cvCloneSeq(const CvSeq* seq,CvMemStorage* storage=NULL)
深度复制一个序列,并创建一个完全独立的序列结构
10.CvSeq* cvSeqSlice(const CvSeq* seq,CvSlice Slice,CvMemStorage* storage=NULL,int copy_data=0);
cvCloneSeq是对cvSeqSlice的简单包装,可以创建一个新的序列(深度复制),也可以仅仅为子序列创建一个头,和原来的序列公用元素空间;第二个参数可以由cvSlice(a,b)或者CV_WHOLE_SEQ构建,a定义开始,b定义结尾来切片,只有切片之间的元素才会被复制,参数copy_data表示是否进行深度复制
11.void cvSeqRemoveSlice(CvSeq* seq,CvSlice slice)
删除切片(cvslice(a,b))之间的序列
12.void cvSeqInsertSlice(CvSeq* seq,int before_index,const CvArr* from_arr)
插入序列
13.void cvSeqSort
对序列进行排序
14.char* cvSeqSearch
搜索序列中的元素
15.cvSeqInvert(CvSeq* seq)
对序列进行呢操作,不会改变元素的内容,但是会将序列中的元素重新组织,改为逆序
16.char* cvSeqPush(CvSeq* seq,void* element=NULL)
在序列块的尾部添加一元素并返回指向该元素得指针,如果element为NULL则只预留空间给下一个元素
17.char* cvSeqPushFront(CvSeq* seq,void* element=NULL)
在序列头添加一个元素
18.void cvSeqPop
弹出序列尾部元素,如果element为NULL则只弹出元素,不保存弹出的元素
19.void cvSeqPopFront
弹出序列头部的元素
20.void cvSeqPushMulti,void cvSeqPopMulti
压入或者弹出多个元素
21.void cvSeqInsert(CvSeq* seq,i before_index)
插入元素
22.void cvSeqRemove(CvSeq* seq,int index)
删除元素
23.序列的读取和写入:
写操作:
1.保存序列写状态的结构为CvSeqWriter,通过cvStartWriteSeq初始化
CvSeqWriter writer;
cvStartWriteSeq(CV_32SC2,sizeof(CvSeq),sizeof(CvPoint),storage,&writer);
2.写入数据
CV_WRITER_SEQ_ELEM(pt,writer);
3.关闭写操作
CvSeq* seq=cvEndWriteSeq(&writer);
读操作:
1.初始化读
void cvStartReadSeq(const CvSeq* seq,CvSeqReader* reader,int reverse=0);
reverse=0表示正序,1表示逆序
2.返回读状态在序列中的当前位置
cvGetSeqReaderPos(CvSeqReader* reader);
3.设置新的读位置
void cvSetSeqReaderPos(CvSeqReader* reader,int index,int is_relative=0)
最后一个参数为0表示序列的绝对位置,否则为相对位置
4.在序列中向前和向后移动
CV_NEXT_SEQ_ELEM(elem_size,reader)
CV_PREV_SEQ_ELEM(elem_size,reader)
5.读元素并将读状态中的位置向前或向后移动一个元素
CV_READ_SEQ_ELEM(elem,reader)
CV_PEV_READ_SEQ_ELEM(elem,reader)
24.序列和数组的转换
1.序列转换为数组
void* cvCvtSeqToArray(const CvSeq* seq,void* elements,CvSlice slice=CV_WHOLE_SEQ)
最后一个参数为对应序列的切片
2.数组转换为序列
CvSeq* cvMakeSeqHeaderForArray(int seq_type,int header_size,int elem_size,void* element,int total,CvSeq* seq,CvSeqBlock* block)
最后一个参数为序列的内存块结构(block)。这种方法生成的序列和其他方法生成的不一样,不能改变已经生成的序列的数据
内存和序列