/* 文件节点类型 file node type */ #define CV_NODE_NONE 0 #define CV_NODE_INT 1 #define CV_NODE_INTEGER CV_NODE_INT #define CV_NODE_REAL 2 #define CV_NODE_FLOAT CV_NODE_REAL #define CV_NODE_STR 3 #define CV_NODE_STRING CV_NODE_STR #define CV_NODE_REF 4 /* not used */ #define CV_NODE_SEQ 5 #define CV_NODE_MAP 6 #define CV_NODE_TYPE_MASK 7 /* 选项标记 optional flags */ #define CV_NODE_USER 16 #define CV_NODE_EMPTY 32 #define CV_NODE_NAMED 64 #define CV_NODE_TYPE(tag) ((tag) & CV_NODE_TYPE_MASK) #define CV_NODE_IS_INT(tag) (CV_NODE_TYPE(tag) == CV_NODE_INT) #define CV_NODE_IS_REAL(tag) (CV_NODE_TYPE(tag) == CV_NODE_REAL) #define CV_NODE_IS_STRING(tag) (CV_NODE_TYPE(tag) == CV_NODE_STRING) #define CV_NODE_IS_SEQ(tag) (CV_NODE_TYPE(tag) == CV_NODE_SEQ) #define CV_NODE_IS_MAP(tag) (CV_NODE_TYPE(tag) == CV_NODE_MAP) #define CV_NODE_IS_COLLECTION(tag) (CV_NODE_TYPE(tag) >= CV_NODE_SEQ) #define CV_NODE_IS_FLOW(tag) (((tag) & CV_NODE_FLOW) != 0) #define CV_NODE_IS_EMPTY(tag) (((tag) & CV_NODE_EMPTY) != 0) #define CV_NODE_IS_USER(tag) (((tag) & CV_NODE_USER) != 0) #define CV_NODE_HAS_NAME(tag) (((tag) & CV_NODE_NAMED) != 0) #define CV_NODE_SEQ_SIMPLE 256 #define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0) typedef struct CvString { int len; char* ptr; } CvString; /* 在读文件存储器中元素的所有关键字(名字)*/ /* 都保存在哈希表中,用于加速查找操作 */ typedef struct CvStringHashNode { unsigned hashval; CvString str; struct CvStringHashNode* next; } CvStringHashNode; /* 文件存储器的基础元素-标量或集合 */ typedef struct CvFileNode { int tag; struct CvTypeInfo* info; /* 类型信息(只用于用户自定义对象,其他为0) */ union { double f; /* 标量浮点数 */ int i; /* 标量整数 */ CvString str; /* 文本字符串 */ CvSeq* seq; /* 序列(文件结点的有序集合) */ struct CvMap* map; /* map (命名的文件结点集合) */ } data; } CvFileNode; 此结构只用于从文件存储器中检索数据使用(也就是用于从文件载入数据)。当数据被写如文件,它使用最小的缓存,顺序的完成。没有数据被存在文件存储器这结构中。 相反,当数据从文件读出后,这个文件被解释并用一个树在内存中表示。树的每个结点都由CvFileNode表示。文件结点N的类型可以通过CV_NODE_TYPE(N->tag)来检索。一些文件结点(叶子)是标量:文本字符串、整数或浮点数。其他结点是文件结点的集合,在它们的顺序上可以是标量或集合。这里有两种集合类型:sequences和maps (我们用YAML符号,当然XML流同样可以)。Sequences(不要和CvSeq混淆)是命名文件结点的有序集合,maps是命名文件结点的无序集合。这样,sequences的元素可以通过索引得到(cvGetSeqElem),maps可以通过名字得到元素(cvGetFileNodeByName)。下表描述了不同类型的文件结点: 这里没有必要直接访问map的field(BTW,CvMap是一个隐藏结构)。map的元素可以通过cvGetFileNodeByName函数来得到,此函数有一个指向该文件结点的指针。 用户定义对象是标准CXCORE类型的对象,如CvMat、CvSeq等,或者是通过cvRegisterTypeInfo注册的任意类型。在文件存储器被打开和解释后,这样的对象开始在文件中作为一个map来表示(如XML和YAML例子表示的那样)。然后,当用户调用cvRead或cvReadByName函数时,对象由请求被编码(转为自然表示方式)。 |
(CvFileNode 结构) 终于被找到了 /* 文件节点类型 file node type */
最新推荐文章于 2023-07-22 11:12:53 发布