33_OpenCV读取XML或YML文件的 cv::FileNode类

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 节点是映射的子结点(即它有一个名字)

具体使用可以参考上篇文章。

你可能感兴趣的:(openCv,opencv)