现在的位置: 首页 > 综合 > 正文

关于cvseq

2013年05月11日 ⁄ 综合 ⁄ 共 4443字 ⁄ 字号 评论关闭

 

1.创建一个CvSeq对象

CvMemStorage *storage=cvCreateMemStorage(0);

CvSeq *seq=cvCreateSeq(0,sizeof(CvSeq),sizeof(int),storage);

这样就创建了一个数据类型为int的seq。

CVAPI(CvMemStorage*) cvCreateMemStorage( int block_size CV_DEFAULT(0));来创建一个内存存储结构,参数block_size表示内存的大小,默认参数0表示内存大小为64K。CV_DEFALUT(0)是一个带参数的宏,具体定义为 #define CV_DEFAULT(val)
= val

CVAPI(CvSeq*) cvCreateSeq( int seq_flags, int header_size,int elem_size, CvMemStorage* storage );用来创建一个CvSeq对象,参数seq_flags表示序列元素的数据类型,一般设置为0即可,即数据类型未指定;参数header_size表示CvSeq结构体的大小,一般设置为sizeof(CvSeq);参数elem_size表示每个元素所占用的字节数,一般设置为sizeof(type),type可取int、float、char、CvPoint等;参数storage表示由函数cvCreateMemStorage创建的内存存储指针。

2.往CvSeq对象中添加元素

上一步我们创建了一个空的CvSeq对象,接下来需要往里面添加元素。有下面几种不同的添加方式。

2.1

for(int i=0;i<10;i++)
      cvSeqPush(seq,&i);

依次在序列seq的结尾添加10个整数。

CVAPI(schar*) cvSeqPush( CvSeq* seq, const void* element CV_DEFAULT(NULL));在序列seq的结尾添加指针element所指向的元素,默认值为NULL。返回值和element相同。

2.2

for(int i=0;i<10;i++)
     cvSeqPushFront(seq,&i);

依次在序列seq的开头添加10个整数。

CVAPI(schar*) cvSeqPushFront( CvSeq* seq, const void* element CV_DEFAULT(NULL));在序列seq的开头添加指针element所指向的元素。

2.3

int i=10;

cvSeqInsert(seq,2,&i);

在序列seq的第2个位置插入i。

CVAPI(schar*) cvSeqInsert( CvSeq* seq, int before_index,const void* element CV_DEFAULT(NULL));在序列的第before_index个位置添加指针element所指向的元素。注意:before_index从0开始。

2.4

int a[5]={1,2,3,4,5};

cvSeqPushMulti(seq,a,5,CV_BACK);

将数组a插入到序列seq的结尾。

CVAPI(void) cvSeqPushMulti( CvSeq* seq, const void* elements,int count, int in_front CV_DEFAULT(0) );将element所指向的count个元素添加到序列seq的一段。in_front可取值CV_BACK或CV_FRONT,分别表示添加到序列的结尾或开头。

2.5

CvSeqWriter writer;

cvStartAppendToSeq(seq,&writer);

for(int i=0;i<10;i++)

       CV_WRITE_SEQ_ELEM(i,writer);

cvEndWriteSeq(seq);

在序列seq的结尾依次添加10个元素

CvSeqWriter是一个结构体。

CVAPI(void) cvStartAppendToSeq( CvSeq* seq, CvSeqWriter* writer );用来初始化writer,新的数据将会添加到序列seq的结尾。

CV_WRITE_SEQ_ELEM( elem, writer ) 是一个宏,用来将元素elem写入到writer所指向的当前位置。

CVAPI(CvSeq*) cvEndWriteSeq( CvSeqWriter* writer );用来关闭序列的写入。

另外,CVAPI(void) cvStartWriteSeq( int seq_flags, int header_size,int elem_size, CvMemStorage* storage,CvSeqWriter* writer );组合了函数cvCreateSeq和cvStartAppendToSeq。

CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer )也是一个带参数的宏,参数elem_ptr指向需要添加的元素。

注: 函数cvCreateSeq中的参数seq_flags可以设定为以下值中的一个。

#define CV_SEQ_ELTYPE_POINT CV_32SC2 /* (x,y) */
#define CV_SEQ_ELTYPE_CODE CV_8UC1 /* freeman code: 0..7 */
#define CV_SEQ_ELTYPE_GENERIC 0
#define CV_SEQ_ELTYPE_PTR CV_USRTYPE1
#define CV_SEQ_ELTYPE_PPOINT CV_SEQ_ELTYPE_PTR /* &(x,y) */
#define CV_SEQ_ELTYPE_INDEX CV_32SC1 /* #(x,y) */
#define CV_SEQ_ELTYPE_GRAPH_EDGE 0 /* &next_o, &next_d, &vtx_o, &vtx_d */
#define CV_SEQ_ELTYPE_GRAPH_VERTEX 0 /* first_edge, &(x,y) */
#define CV_SEQ_ELTYPE_TRIAN_ATR 0 /* vertex of the binary tree */
#define CV_SEQ_ELTYPE_CONNECTED_COMP 0 /* connected component */
#define CV_SEQ_ELTYPE_POINT3D CV_32FC3 /* (x,y,z) */

 

 

 

 

函数原型 说明
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)

功能:初始化序列中的读取过程

 

 

 

CvArr
不确定数组

typedef void CvArr;
CvArr* 仅仅是被用于作函数的参数,用于指示函数接收的数组类型可以不止一个,如 IplImage*, CvMat* 甚至 CvSeq*. 最终的数组类型是在运行时通过分析数组头的前4 个字节判断。

【上篇】
【下篇】

抱歉!评论已关闭.