可动态增长元素序列(OpenCV_1.0已发生改变,详见cxtypes.h) Growable sequence of elements
#define CV_SEQUENCE_FIELDS() \ int flags; /* micsellaneous flags */ \ int header_size; /* size of sequence header */ \ struct CvSeq* h_prev; /* previous sequence */ \ struct CvSeq* h_next; /* next sequence */ \ struct CvSeq* v_prev; /* 2nd previous sequence */ \ struct CvSeq* v_next; /* 2nd next sequence */ \ int total; /* total number of elements */ \ int elem_size;/* size of sequence element in bytes */ \ char* block_max;/* maximal bound of the last block */ \ char* ptr; /* current write pointer */ \ int delta_elems; /* how many elements allocated when the sequence grows (sequence granularity) */ \ CvMemStorage* storage; /* where the seq is stored */ \ CvSeqBlock* free_blocks; /* free blocks list */ \ CvSeqBlock* first; /* pointer to the first sequence block */ typedef struct CvSeq { CV_SEQUENCE_FIELDS() } CvSeq;
结构CvSeq是所有OpenCV动态数据结构的基础。 在1.0版本中,将前六个成员剥离出来定义成一个宏. 通过不同寻常的宏定义简化了带有附加参数的结构 CvSeq 的扩展。为了扩展 CvSeq, 用户可以定义一新的数据结构或在通过宏CV_SEQUENCE_FIELDS()所包括的 CvSeq 的域后在放入用户自定义的域。
有两种类型的序列 -- 稠密序列和稀疏序列。稠密序列都派生自 CvSeq, 它们用来代表可扩展的一维数组 -- 向量,栈,队列,双端队列。数据间不存在空隙(即:连续存放)-- 如果元素从序列中间被删除或插入新的元素到序列中(不是两端),那么此元素后边的相关元素会被移动。稀疏序列都派生自 CvSet,后面会有详细的讨论。它们都是由节点所组成的序列,每一个节点要么被占用空间要么是空,由 flag 标志指定。这些序列作为无序的数据结构而被使用,如点集,图,哈希表等。
域 header_size(结构的大小) 含有序列头部节点的实际大小,此大小大于或等于 sizeof(CvSeq).当这个宏用在序列中时,应该等于 sizeof(CvSeq),若这个宏用在其他结构中,如CvContour,结构的大小应该大于sizeof(CvSeq); 域 h_prev, h_next, v_prev, v_next 可用来创建不同序列的层次结构。域 h_prev, h_next 指向同一层次结构前一个和后一个序列,而域 v_prev, v_next指向在垂直方向上的前一个和后一个序列,即:父亲和子孙。
域 first 指向第一个序列快,块结构在后面描述。
域 total 包含稠密序列的总元素数和稀疏序列被分配的节点数。
域 flags 的高16位描述(包含)特定的动态结构类型(CV_SEQ_MAGIC_VAL 表示稠密序列,CV_SET_MAGIC_VAL 表示稀疏序列),同时包含形形色色的信息。
低 CV_SEQ_ELTYPE_BITS 位包含元素类型的 ID(标示符)。大多数处理函数并不会用到元素类型,而会用到存放在 elem_size 中的元素大小 。如果序列中包含 CvMat 中的数据,那么元素的类型就与 CvMat 中的类型相匹配, 如:CV_32SC2 可以被使用为由二维空间中的点序列, CV_32FC1用为由浮点数组成的序列等。通过宏 CV_SEQ_ELTYPE(seq_header_ptr) 来获取序列中元素的类型。处理数字序列的函数判断: elem.size 等同于序列元素的大小。除了与 CvMat 相兼容的类型外,还有几个在头 cvtypes.h 中定义的额外的类型。
函数原型 | 说明 |
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) | 功能:初始化序列中的读取过程 |