首页 > 代码库 > 内存和序列

内存和序列

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=http://www.mamicode.com/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)。这种方法生成的序列和其他方法生成的不一样,不能改变已经生成的序列的数据


本文出自 “flyclc” 博客,请务必保留此出处http://flyclc.blog.51cto.com/1385758/1539756