CvSeq
轮廓是由一个一个像素组成的,在内存中存储一条轮廓,就需要用到序列(CvSeq)结构,另外,在处理任何有序关系的动态的对象时可以用到CvSeq。序列是某种结构的链表,被实现为一个双端队列,因此可以实现快速的随机访问以及快速删除顶端的元素,但是从中间删除元素值则稍慢些。
CvSeq::total是指序列内部有效元素的个数;而h_next和h_prev并不是指向CvSeq内部元 素的指针,它们是指向其它CvSeq的。
The sequence structure itself has some important elements that you should be aware of. The first, and one you will use often, is total . This is the total number of points or objects in the sequence. The next four important elements are pointers to other sequence: h_prev , h_next , v_prev and v_next . These four pointers are part of what are called CV_TREE_NODE_FIELDS ; they are used not to indicate elements inside of the sequence but rather to connect different sequences to one another. Other objects in the OpenCV universe also contain these tree node fields.
域 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)
功能:在序列头部添加元素
coid cvSeqPopFront(CvSeq* seq,void* element=NULL)
功能:删除在序列的头部的元素
coid cvSeqPushMulti(CvSeq* seq,void* elements,int count,int in_front=0);
功能:添加多个元素到序列尾部或头部
coid cvSeqPopMulti(CvSeq* seq,void* elements,int count,int in_front=0)
功能:删除多个序列头部或尾部元素
char* cvSeqInsert(CvSeq* seq,int before_index,void* element=NULL)
功能:在序列中的指定位置添加元素
coid 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)
功能:初始化序列中的读取过程
- CvSeq*pCurSeq=pInputSeq;
- CvSeq*pOldSeq=NULL;
- while(pCurSeq)
- {
- if(process(pCurSeq))
- {
- pOldSeq=pCurSeq;
- if(pOldSeq->h_prev)
- {
- pCurSeq=pOldSeq->h_prev;
- pCurSeq->h_next=pOldSeq->h_next;
- pOldSeq->h_next->h_prev=pCurSeq;
- pCurSeq=pCurSeq->h_next;
- cvClearSeq(pOldSeq);
- }
- else
- {
- pCurSeq=pOldSeq->h_next;
- pCurSeq->h_prev=NULL;
- cvClearSeq(pOldSeq);
- }
- }
- else
- {
- pCurSeq=pCurSeq->h_next;
- }
- }
热门话题 · · · · · · ( 去话题广场 )
- 2024画春天 151.0万次浏览
- 我的个人阅读史 435次浏览
- 发疯有用且很爽 新话题 · 2340次浏览
- 你心中最想重制的游戏神作 5.7万次浏览
- 哪件事情让你对“这里是家”这句话深有感触? 14.1万次浏览
- 最喜欢的月饼口味 25.9万次浏览