关于cvseq

news/2024/7/3 12:24:52 标签: null, header, graph, 存储, tree, float
 

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 个字节判断。

treeSkill">

http://www.niftyadmin.cn/n/619818.html

相关文章

java基础 哈希表入门理解

在集合类会看见很多这个单词hash。hash其实就是一种存储的算法叫做哈希表。 而理解哈希表&#xff0c;其实需要有几个前提&#xff1a;数组&#xff0c;模运算&#xff0c;链表。 先声明本章不会讲的多深&#xff0c;如果需要进阶的朋友就不要看了&#xff0c;因为看了也不会…

如何把 CvSeq 转去CvPoint和如何从CvPoint写入CvSeq

CvPoint* point new CvPoint[length]; //分配轮廓点 int i; for (i 0; i < length; i) point[i]*CV_GET_SEQ_ELEM(CvPoint,contours,i);//一个一个的读取数据 CvMemStorage* storage1 cvCreateMemStorage(0); CvSeq* seq cvCreateSeq( CV_32SC2, /* sequence …

vector容器和iterator迭代器

vector容器是一个模板类&#xff0c;可以存放任何类型的对象&#xff08;但必须是同一类对象&#xff09;。vector对象可以在运行时高效地添加元素&#xff0c;并且vector中元素是连续存储的。 vector容器内存放的所有对象都是经过初始化的。如果没有指定存储对象的初始值&…

java基础 浅解list集合中Set中的HashSet,LinkedHashSet,TreeSet

collection接口中有list&#xff0c;set&#xff0c;还有map。而之前一篇这讲了list接口中常用的实现类以及方法&#xff0c;现在我们一下set。 set作为一个集合&#xff0c;自然尤其特征就是无序存储&#xff0c;数据不可重复。 set接口的实现类常用的有HashSet&#xff0c;…

引用和指针的区别,*和操作符

一、在声明中见到这两个操作符&#xff08;*和&&#xff09;时&#xff1a; ①在程序声明变量的时候使用的*&#xff0c;只是表明“它是一个整数&#xff0c;这个整数为某个内存地址&#xff0c;一次访问sizeof(type)长度”。这点不要和(*)操作符混淆&#xff1b; ②在程…

java基础 浅析内部类

内部类观其名知其意。内部类就是将类定义再另一个类的内部&#xff0c;该类就称为内部类。 但是内部类在声明所在的位置不同有具体分四种&#xff1a;成员内部类、局部内部类、匿名内部类和静态内部类 内部类的特点&#xff1a; 内部类可以无条件访问外部类的所有成员属性和…

java基础 浅析MAP原理以及1.7与1.8的区别

前面讲到的List&#xff0c;Set接口都是存储数据的结构。但是有一种却无法很简单存储&#xff0c;比如key-value。为什么要有这样的结构。而这样的结构有什么好处&#xff0c;等下面讲解的时候&#xff0c;就会明白。 所以分两部分&#xff0c;看源码然后观其实现原理&#xf…

函数的形参(普通形参、指针形参、引用形参)

int n10; add1(n); 1、普通形参 void add1(int v1) { v11;/对实参无影响 } 这是最普通的形参方式&#xff0c;形参仅仅为实参的一个副本&#xff0c;对形参的任何操作不会修改实参的值。例中对v1的操作只是修改了实参的一个副本。实参不变 int *p&n; add2(p);//p为指向…