opencv中CvSeq的用法

来源:互联网 发布:沪昆高铁贵州段 知乎 编辑:程序博客网 时间:2024/05/18 02:44

最近遇到了Opencv中的CvSeq结构的用法,由于我基础较差,刚开始看不懂,不得不花时间去查阅,如果分析的不对还请大家指出来!

CvSeq结构在Opencv中的源码如下面所示:

#define CV_TREE_NODE_FIELDS(node_type)                               \
    int       flags;             /* Miscellaneous flags.     */      \
    int       header_size;       /* Size of sequence header. */      \
    struct    node_type* h_prev; /* Previous sequence.       */      \
    struct    node_type* h_next; /* Next sequence.           */      \
    struct    node_type* v_prev; /* 2nd previous sequence.   */      \
    struct    node_type* v_next  /* 2nd next sequence.       */

/*
   Read/Write sequence.
   Elements can be dynamically inserted to or deleted from the sequence.
*/
#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. */

typedef struct CvSeq
{
    CV_SEQUENCE_FIELDS()
}
CvSeq;

参考http://blog.csdn.net/yangqiuying/article/details/8500601

大致的含义如下:

#define CVgSEQUENCE\_FIELDS() \
    int flags; /* micsellaneous flags */ \
    int header_size; /* 序列头的大小 */ \
    struct CvSeq* h_prev; /* 前一个序列 */ \
    struct CvSeq* h_next; /* 后一个序列 */ \
    struct CvSeq* v_prev; /* 第二级前一个序列 */ \
    struct CvSeq* v_next; /* 第二级后一个序列 */ \
    int total; /* 元素的总个数 */ \
    int elem_size;/* 元素的尺寸 */ \
    char* block_max;/* 上一块的最大块 */ \
    char* ptr; /* 当前写指针 */ \
    int delta_elems; /*序列中快的大小
                        (序列粒度) */
 \
    CvMemStorage* storage; /*序列的存储位置 */ \
    CvSeqBlock* free_blocks; /* 未分配的块序列 */ \
    CvSeqBlock* first; /* 指向第一个快序列 */

CvSeq结构中,第一部分#define CV_TREE_NODE_FIELDS(node_type) 和第二部分#define CV_SEQUENCE_FIELDS() 主要用到了#define的多行定义,

第三部分

typedef struct CvSeq
{
    CV_SEQUENCE_FIELDS()
}
CvSeq;

主要是定义了一个结构体,其中最后的CvSeq为简化而重新命名,而这里的CV_SEQUENCE_FIELDS()主要是用到了前面的几个宏定义,实现了替换,注意这里是没有分号的。

最后对这个结构体做了一个小的测试,具体代码见:http://download.csdn.net/detail/gxiaob/5106594

对其更深入的探讨请参考http://blog.csdn.net/wqvbjhc/article/details/5497017



 

原创粉丝点击