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的内部结构探讨
--------------------------------------------------------------------------------
view plaincopy to clipboardprint?
CvSeq *pCurSeq = pInputSeq;
int index = 0;
while( pCurSeq=pCurSeq->h_next )
{
}
CvSeq *pCurSeq = pInputSeq;
int index = 0;
while( pCurSeq=pCurSeq->h_next )
{
}
事实证明这段代码是错误的,而且往往返回的错误信息是
> 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)
#define CV_SEQUENCE_FIELDS()