• 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);
  • 相关阅读:
    来谈谈JAVA面向对象
    手把手的SpringBoot教程,SpringBoot创建web项目(一)
    【Java框架型项目从入门到装逼】第十五节
    印章文字识别
    《图像处理实例》之 曲线之间距离求解
    机器学习常用模块
    Ubutu16.04+Cuda9.2/9.0+Cudnn7.12/7.05+TensorFlow-gpu-1.8/1.6
    滑动平均模型原理+源码分析
    AlexNet实践
    TensorFlow NormLization
  • 原文地址:https://www.cnblogs.com/farewell-farewell/p/5999908.html
Copyright © 2020-2023  润新知