zoukankan      html  css  js  c++  java
  • opencv之内存存储器——CvMemStorage与CvSeq

    1、CvMemStorage *storage=cvCreateMemStorage(block_size);
    用来创建一个内存存储器,来统一管理各种动态对象的内存。
    函数返回一个新创建的内存存储器指针。
    参数block_size对应内存器中每个内存块的大小,为0时内存块默认大小为64k。
     
    2、cvCreateSeq
    CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)
    功能:创建一序列
    说明:CvSeq本身就是一个可增长的序列,不是固定的序列
    参数:
    seq_flags为序列的符号标志。如果序列不会被传递给任何使用特定序列的函数,那么将它设为0,否则从预定义的序列类型中选择一合适的类型。
    Header_size为序列头部的大小;必须大于或等于sizeof(CvSeq)。如果制定了类型或它的扩展名,则此类型必须适合基类的头部大小。
    Elem_size为元素的大小,以字节计。这个大小必须与序列类型(由seq_flags指定)相一致。
    例如,对于一个点的序列,元素类型 CV_SEQ_ELTYPE_POINT应当被指定,参数elem_size必须等同于sizeof(CvPoint)。Storage为指向前面定义的内存存储器.
     

    动态结构序列CvSeq是所有OpenCV动态数据结构的基础。有两种类型的序列:稠密序列,稀疏序列:

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

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

    结构CvSeq的具体定义如下:

    #define CV_SEQUENCE_FIELDS()                                            
        CV_TREE_NODE_FIELDS(CvSeq);                                         
        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 seq grows */  
        CvMemStorage* storage;    /* where the seq is stored */             
        CvSeqBlock* free_blocks;  /* free blocks list */                    
        CvSeqBlock* first; /* pointer to the first sequence block */

    total表示稠密序列的元素个数,或者稀疏序列被分配的节点数。

    elem_size表示序列中每个元素占用的字节数。

    block_max是最近一个内存的最大边界指针。

    ptr表示当写指针。

    delta_elems表示序列间隔尺寸。

    storage指向序列存储的内存块的指针。

    free_blocks表示空的块列表。first指向第一个序列块。

     
     主要功能函数:

    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)
    功能:初始化序列中的读取过程

     
  • 相关阅读:
    mysql无法启动ERROR! MySQL is running but PID file could not be found ?
    mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊
    mybatis resultmap标签type属性什么意思
    python学习笔记——第三章 串
    POJ 2485:Highways(最小生成树&amp;&amp;prim)
    G-Sensor 校准标准
    Unity3D 4.x 使用Mecanim实现动画控制
    quartz群调查调度机制和源代码分析
    什么是你的七个核心竞争力-弱点让你闪
    poj 3368 Frequent values(段树)
  • 原文地址:https://www.cnblogs.com/perfy/p/7404172.html
Copyright © 2011-2022 走看看