cv::FileNode通常在cv::FileStorage对象读取文件时使用,cv::FileStorage::operator>>操作符的返回值是一个cv::FileNode对象。
成功构建cv::FileNode对象之后,便可以利用它来完成许多工作。如果直接表示一个实际的对象(或者一个数字或者字符串),可以直接使用重载操作符cv::FileStorage::operator>>(),将它的值加载到对应类型的变量之中。可以使用以下形式:
cv::Mat anArray;
fs["anArray"] >> anArray;
int aNumber;
fs["someInteger"] >> aNumber;
// 或
int nNumber;
nNumber = (int)fs["someInteger"];
可以使用迭代器完成对cv::FileNode的遍历。给定一个cv::FileNode对象,使用成员函数cv::FileNode::begin()和cv::FileNode::end()可以分别返回该mapping或者sequence的首元素的迭代器和末尾元素的迭代器。
该迭代器对象可以通过cv::FileNodeIterator::operator*()操作符来进行解引用操作并返回迭代器对应的位置的FileNode对象。如果该迭代器在对一个mapping进行遍历,那么返回的cv::FileNode对象将会由一个名字属性,并且可以通过cv::FileNode::name()函数进行获取。
如下是cv::FileNode的成员函数:
成员函数 | 说明 |
cv::FileNode fn | 默认构造函数 |
cv::FileNode fn1(fn0) | 复制构造函数,从节点fn0创建节点fn1 |
cv::FileNode fn1(fs,node) | 构造函数,从C风格的CvFileStorage *指针fs和C风格的CvFileNode*指针节点创建一个C++风格的cv::FileNode对象 |
fn[ (string)key] | 命名字串(映射节点)的STL字符串或C字符串存取器,将密钥转换为适当的子结点 |
fn[ (const char*)key ] | |
fn[ (int)id ] | 子编号(序列节点)的访问;将ID转换为相应的子结点 |
fn.type() | 返回节点类型enum |
fn.empty() | 确定节点是否为空 |
fn.isNone() | 确定节点是否具有None |
fn.isSeq() | 确定节点是否是序列 |
fn.isMap() | 确定节点是否是映射 |
fn.isInt() | 确定节点是否为整数、浮点数或字符串(分别) |
fn.isReal() | |
fn.isString() | |
fn.name() | 如果节点是映射的子结点,则返回节点名称 |
size_t sz = fn.size() | 返回序列或映射中的一些元素 |
(int)fn | 从包含整数、32位浮点数、64位浮点数或字符串(分别)的节点中提取值 |
(float)fn | |
(double)fn | |
(string)fn |
需要注意的是cv::FileNode::type()函数,该函数的返回值为类cv::FileNode中所定义的枚举类型。可能的枚举值如下:
type()返回的枚举值 | 说明 |
cv::FileNpde::NONE = 0 | 节点类型为None |
cv::FileNode::INT = 1 | 节点包含一个整数 |
cv::FileNode::REAL = 2 | 节点包含一个浮点数注释 |
cv::FileNode::FLOAT = 2 | |
cv::FileNode::STR = 3 | 节点包含一个字符串 |
cv::FileNode::STRING | |
cv::FileNode::REF = 4 | 节点包含参考(即复合对象) |
cv::FileNode::SEQ = 5 | 节点本身是其他节点的序列 |
cv::FileNode::MAP = 6 | 节点本身是其他节点的映射 |
cv::FileNode::FLOW = 8 | 节点是序列或映射的紧凑表示 |
cv::FileNode::USER = 16 | 节点是注册对象(例如矩阵) |
cv::FileNode::EMPTY = 32 | 节点没有赋值给它 |
cv::FileNode::NAMED = 64 | 节点是映射的子结点(即它有一个名字) |
具体使用可以参考上篇文章。