(CvFileNode 结构) 终于被找到了 /* 文件节点类型 file node type */

/* 文件节点类型 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)。下表描述了不同类型的文件结点:
Type CV_NODE_TYPE(node->tag) Value
Integer CV_NODE_INT node->data.i
Floating-point CV_NODE_REAL node->data.f
Text string CV_NODE_STR node->data.str.ptr
Sequence CV_NODE_SEQ node->data.seq
Map CV_NODE_MAP node->data.map*


这里没有必要直接访问map的field(BTW,CvMap是一个隐藏结构)。map的元素可以通过cvGetFileNodeByName函数来得到,此函数有一个指向该文件结点的指针。

用户定义对象是标准CXCORE类型的对象,如CvMat、CvSeq等,或者是通过cvRegisterTypeInfo注册的任意类型。在文件存储器被打开和解释后,这样的对象开始在文件中作为一个map来表示(如XML和YAML例子表示的那样)。然后,当用户调用cvRead或cvReadByName函数时,对象由请求被编码(转为自然表示方式)。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值