openCV中 cvSeq的用法说明

时间:2022-11-24 04:25:30

openCV中 cvSeq的用法说明

http://blog.csdn.net/wqvbjhc/archive/2010/04/17/5497017.aspx
--------------------------------------------------------------------------------

函数原型 说明
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)
功能:初始化序列中的读取过程

OpenCV CvSeq的内部结构探讨
--------------------------------------------------------------------------------

一直困惑于CvSeq到底是个什么样的东西,因为曾经拿到别人写的一个函数库,其返回值是一个CvSeq指针,我的任务是遍历所有的Sequence,然后删除其中不符合要求的Sequence。由于没有文档,我当时并不知道我需要遍历的是Sequence还是Sequence中的Element。于是我写下了类似如下的代码:
view plaincopy to clipboardprint?
CvSeq *pCurSeq = pInputSeq;
int index = 0;
while( pCurSeq=pCurSeq->h_next )

if( process(pCurSeq) )
{
pCurSeq = pCurSeq->h_prev; //这里为了简单不考虑是否为列表头
cvSeqRemove(pInputSeq, index);
--index;
}
++index;
}
CvSeq *pCurSeq = pInputSeq;
int index = 0;
while( pCurSeq=pCurSeq->h_next )
{
if( process(pCurSeq) )
{
pCurSeq = pCurSeq->h_prev; //这里为了简单不考虑是否为列表头
cvSeqRemove(pInputSeq, index);
--index;
}
++index;
}
事实证明这段代码是错误的,而且往往返回的错误信息是
> OpenCV ERROR: One of arguments' values is out of range (Invalid index)
> in function cvSeqRemove, cxdatastructs.cpp(1587)

为什么会有这样的错误呢?看一下CvSeq的源代码就可略见一斑。下面是OpenCV2.0版本有关CvSeq的定义
#define CV_TREE_NODE_FIELDS(node_type) \
int flags; \
int header_size; \
struct node_type* h_prev; \
struct node_type* h_next; \
struct node_type* v_prev; \
struct node_type* v_next

#define CV_SEQUENCE_FIELDS() \
CV_TREE_NODE_FIELDS(CvSeq); \
int total; // total number of elements\