OpenCV——CvSeq动态结构序列

Posted Not-Bad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV——CvSeq动态结构序列相关的知识,希望对你有一定的参考价值。

动态结构序列CvSeq是所有OpenCV动态数据结构的基础。

分为两类:

  •  稠密序列
  •  稀疏序列

(1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 — 向量、栈、队列和双端队列。数据间不存在空隙(连续存储)。如果元素元素从序列中间被删除或插入新的元素到序列,那么此元素后边的相关元素全部被移动。

(2)稀疏序列派生自CvSet,CvSet也是基于CvSeq的,他们都是由节点所组成,每一个节点要么被占用,那么为空,由标志位flag决定。这些序列作为无序数据结构被使用,如点集合、图、Hash表等。

CvSeq的定义如下:

<span style="color:#ff0000; font-style:italic">/* 
   Read/Write sequence. 
   Elements can be dynamically inserted to or deleted from the sequence. 
*/</span>  
<span style="color:#339900">#define CV_SEQUENCE_FIELDS()                                              \  
    CV_TREE_NODE_FIELDS(CvSeq);                                           \  
    int       total;          /* Total number of elements.            */  \  
    int       elem_size;      /* Size of sequence element in bytes.   */  \  
    schar*    block_max;      /* Maximal bound of the last block.     */  \  
    schar*    ptr;            /* Current write pointer.               */  \  
    int       delta_elems;    /* Grow seq this many at a time.        */  \  
    CvMemStorage* storage;    /* Where the seq is stored.             */  \  
    CvSeqBlock* free_blocks;  /* Free blocks list.                    */  \  
    CvSeqBlock* first;        /* Pointer to the first sequence block. */</span>  
   
<span style="color:#00ff00">typedef</span> <span style="color:#00ff00">struct</span> CvSeq  
<span style="color:#080000">{</span>  
    CV_SEQUENCE_FIELDS<span style="color:#080000">(</span><span style="color:#080000">)</span>  
<span style="color:#080000">}</span>  
CvSeq<span style="color:#080800">;</span>  
/*
total表示稠密序列的元素个数,或者稀疏序列被分配的节点数。
elem_size表示序列中每个元素占用的字节数。
block_max是最近一个内存的最大边界指针。
ptr表示当写指针。
delta_elems表示序列间隔尺寸。
storage指向序列存储的内存块的指针。
free_blocks表示空的块列表。
first指向第一个序列块。

h_next和h_prev并不是指向CvSeq内部元素的指针,它们是指向其它CvSeq的。
*/

 

有关CvSeq的函数

//创建序列
CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* 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动态结构序列的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 序列——如何创建点对序列?

大图像的 OpenCV CvSeq 递归元素访问失败?

从“CvSeq”类型到“CvPoint*”类型的无效转换(如何在 Opencv 中进行类型转换)

OpenCV图像的轮廓

Opencv的cvDilate函数

凸缺陷 C++ OpenCv