zoukankan      html  css  js  c++  java
  • OpenCV学习(4)——动态结构

    学习一个新知识,无外乎学习它本身和它的工具。OpenCV提供许多内置的结构及处理函数,非常值得学习。

    内存存储


    在OpenCV中,内存存储器是一个可以用来存储序列、数组和图像的动态增长的数据结构。它由一系列的等大小的内存块组成,是一个线性结构。

    C++ Code
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct CvMemStorage
    {
       
    struct CvMemBlock *bottom;
       
    struct CvMemBlock *top;
       
    struct CvMemStorage *parent;
       
    int block_size;
       
    int free_space;
    } CvMemStorage;

    bottom指的是列首,top指的是当前指向的块但未必是列尾。在bottom和top之间所有的块(包括bottom, 不包括top)被完全占据了空间;在top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top块本身则被占据了部分空间;free_space指的是top块剩余的空字节数。

    C++ Code
    1
    2
    3
    4
    5
     
    //创建内存块,返回指向块头部的指针
    CvMemStorage *cvCreateMemStorage(int block_size = 0 );

    //删除内存块
    void cvReleaseMemStorage(CvMemStorage **storage);

    序列


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

    稀疏序列都派生自CvSet,CvSet是基于CvSeq。它们都是由结点所组成的序列,每一个结点要么被占用要么是空的。这些序列作为无序的数据结构被使用,如点集、图、哈希表等。

    C++ Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    //创建一序列
    CvSeq* cvCreateSeq(int seq_flags , int header_size , int elem_size , CvMenStorage* storage);

    //创建序列的拷贝
    CvSeq* cvCloneSeq(const CvSeq* seq , CvMenStorage* storage = NULL);

    //序列逆序
    CvSeq* cvSeqInvert(CvSeq* seq);

    //序列排序
    CvSeq* cvSeqSort(CvSeq* seq , CvCmpFunc func , void* userdata = NULL);

    //序列搜索
    CvSeq* cvSeqSearch(CvSeq* seq , const void* elem , CvCmpFunc func , int is_sorted , int* elem_index , void* userdata = NULL);

    //清空序列
    CvSeq* cvClearSeq(CvSeq* seq );

    //添加元素
    CvSeq* cvSeqPush(CvSeq* seq , void* element = NULL);

    //序列pop操作
    CvSeq* cvSeqPop(CvSeq* seq , void* element = NULL);

    //序列头部添加元素
    CvSeq* cvSeqPushFront(CvSeq* seq , void* element = NULL);

    //删除序列的头部元素
    CvSeq* cvSeqPopFront(CvSeq* seq , void* element = NULL);

    //添加多个元素
    CvSeq* cvSeqPushMulti(CvSeq* seq , void* element = NULL , int count , int in_front = 0);

    //删除多个元素
    CvSeq* cvSeqPopMulti(CvSeq* seq , void* element = NULL , int count , int in_front = 0);

    //添加元素到指定位置
    CvSeq* cvSeqInsert(CvSeq* seq , int before_index , void* element = NULL);

    //删除指定位置元素
    CvSeq* cvSeqRemove(CvSeq* seq , int index );

    //返回索引位置的元素的指针
    char* cvGetSeqElem(const CvSeq* seq , int index);

    //将数据写入序列
    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);

    集合


    在OpenCV中,Cvset用来代表图形、稀疏多维数组和平面子划分等

    C++ Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //创建空的集合
    CvSet* cvCreateSet(int set_flags , int header_size , int elem_size , CvMemStorage* storage);

    //创建集合中的一个结点
    int cvSetAdd(CvSet* set_header , CvSetElem* elem = NULL , CvSetElem** inserted_elem = NULL);

    //从集合中删除元素
    void cvSetRemove(CvSet* set_header , int index);

    //添加元素
    CvSetElem* cvSetNew(CvSet* set_header , int index);

    //删除指针指向的元素
    void cvSetRemoveByPtr(CvSet* set_header , void* elem);

    //索引元素集合
    CvSetElem* cvGetSetElem(const CvSet* set_header , int index);

    //清空集合
    void cvClearSet(CvSet* set_header);


    C++ Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    //创建图
    CvGraph* cvCreateGraph(int graph_flags , int header_size , int vtx_size , int edge_size , CvMemSorage* storage);

    //插入顶点
    int cvGraphAddVtx(CvGraph* graph , const CvGraphVtx* vtx = NULL , const CvGraphVtx** inserted_vtx = NULL);

    //删除一个顶点
    int cvGraphRemoveVtx(CvGraph* graph , int index);

    //通过指针删除顶点
    int cvGraphRemoveVtxByPrt(CvGraph* graph , CvGraphVtx* vtx);

    //通过索引查找顶点
    CvGraphVtx* cvGetGraphVtx(CvGraph* graph , int vtx_idx);

    //返回相应的索引值
    int cvGraphVtxIdx(CvGraph* graph , CvGraphVtx* vtx);

    //通过索引添加边
    int cvGraphAddEdge(CvGraph* graph , int start_idx , int end_idx ,
                      
    const CvGraphEdge* edge = NULL , CvGraphEdge** inserted_edge = NULL);

    //通过指针添加边
    int cvGraphAddEdgeByPtr(CvGraph* graph , CvGraphVtx* start_vtx , CvGraphVtx* end_vtx ,
                           
    const CvGraphEdge* edge = NULL , CvGraphEdge** inserted_edge = NULL);

    //通过索引删除边
    void cvGraphRemoveEdge(CvGraph* graph , int start_idx , int end_idx);

    //通过指针删除边
    void cvGraphRemoveEdgeByPtr(CvGraph* graph , CvGraphVtx* start_vtx , CvGraphVtx* end_vtx);

    树 


    C++ Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    //初始化树迭代器
    void cvInitTreeNodeIterator(TreeNodeIterator* tree_iterator , const void* first , int max_level);

    //返回当前节点,迭代器移动到下一个节点
    void* cvNextTreeNode(TreeNodeIterator* tree_iterator);

    //返回当前节点,迭代器移动到前个节点
    void* cvPrevTreeNode(TreeNodeIterator* tree_iterator);

    //将所有节点放在序列中
    CvSeq* cvTreeToNodeSeq(const void* first , int header_size , CvMemStorage* storage);

    //插入节点
    void cvInsertNodeToTree(void* node , void* parent , void* frame);

    //删除节点
    void cvRemoveNodeFromTree(void* node , void* frame);
  • 相关阅读:
    【C++】对象模型之Function
    linux扩展磁盘
    swift文件操作
    WEEK丢人周
    swift upload
    桌面管理器
    linux 撤销软件卸载
    声明Complex类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较相等等操作
    eclipse踩坑
    QQ语音消息提取 amr文件解密
  • 原文地址:https://www.cnblogs.com/finlay/p/3451162.html
Copyright © 2011-2022 走看看