最近遇到了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.youkuaiyun.com/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.youkuaiyun.com/detail/gxiaob/5106594
对其更深入的探讨请参考http://blog.youkuaiyun.com/wqvbjhc/article/details/5497017