opencv中的FileStorage类使用注意事项

本文介绍了 OpenCV 中 FileStorage 类的基本用法,包括如何利用该类进行 XML 和 YAML 文件的读写操作,以及如何处理各种数据结构如 Mat、vector 和 maps 的存储与读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FileStorage类是opencv中用来进行文件操作的封装类,可以对XML,YAML,txt甚至doc文件进行读写操作。在使用opencv时经常需要对特征数据等进行保存,这时候通常会选择XML文件或者YAML文件。xml和yaml都是属于标记语言,开发者可以根据自身需要定义标签。同时他们也是一种语义/结构化语言,他们可以描述文档的结构和语义。FileStorage类可以对C++的基础数据类型(int,float,double等)、容器类(vector,maps)、opencv定义的数据结构(Mat,Scalar等)进行读写操作。

FileStorage类的使用流程如下:

(1)实例化一个FileStorage类对象

(2)使用流操作符<<进行文件写入,>>进行文件读取,类似C++中的文件操作

(3)使用FileStorage::release()函数析构掉类对象,并关闭文件

给出具体实例:

参考:http://www.cnblogs.com/marcworld/p/3744747.html?utm_source=tuicool&utm_medium=referral

#include <opencv2/core/core.hpp>
#include <iostream>
#include <string>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
  //打开XML文件
  string filename = "I.xml";
  //------------(1)------------
  FileStorage fs(filename, FileStorage::WRITE);
  //------------(2)------------
  //fs.open(filename, FileStorage::READ);

  //----------------简单数据结构输入输出----------------
  //输出数字和文本
  fs << "iterationNr" << 100;
  //输入数字和文本
  //fs.open(filename, FileStorage::READ);	//不要忘记将fs重定向为"READ"
  //int itNr;
  //------------(1)------------
  //fs["iterationNr"] >> itNr;
  //------------(2)------------
  //itNr = (int)fs["iterationNr"];
  //cout<<"iterationNr  "<<itNr;
  
  //输出大型数据结构Mat
  Mat R = Mat_<uchar >::eye  (3, 3),
    T = Mat_<double>::zeros(3, 1);
  fs << "R" << R;
  fs << "T" << T;
  //输入Mat
  //fs.open(filename, FileStorage::READ);	//不要忘记将fs重定向为"READ"
  //fs["R"] >> R;
  //fs["T"] >> T;
  //----------------------------------------------------------

  //----------------复杂数据结构输入输出----------------
  //输出数组(vector),[]表示vector的边界
  fs<<"strings";
  fs<<"[";
  fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
  fs<<"]";
  //输出maps.{}表示maps的边界
  fs<<"Mapping";
  fs<<"{";
  fs<<"One"<<1;
  fs<<"Two"<<2;
  fs<<"}";

  //输入数组
  fs.open(filename, FileStorage::READ);	//不要忘记将fs重定向为"READ"
  FileNode n = fs["strings"];	// 读取字符串序列 - 获取节点
  if (n.type() != FileNode::SEQ)
  {
    cerr << "strings is not a sequence! FAIL" << endl;
    return 1;
  }
  FileNodeIterator it = n.begin(), it_end = n.end(); // 遍历节点
  for (; it != it_end; ++it)
    cout << (string)*it << endl;
  //输入maps
  n = fs["Mapping"];	// 从序列中读取map
  cout << "Two  " << (int)(n["Two"]) << endl;
  cout << "One  " << (int)(n["One"]) << endl;
  //----------------------------------------------------------

  //关闭XML文件
  fs.release();

  return 0;
}
注意:由于XML和YAML是标签语言,通过类似<book>、<name>等来区分不同内容数据。例子中
 //输出数组(vector)
  fs<<"strings";
  fs<<"[";
  fs<<"image1.jpg"<<"Awesomeness"<<"baboon.jpg";
  fs<<"]";

fs<<"strings";输入的是标签,这里切不可写成fs<<"strings:"如果多加了个冒号则会报错:
OpenCV Error: Bad argument (Key name may only contain alphanumeric characters [a-zA-Z0-9]
fs<<"[";代表向量vector的开始,后续输入则是向量容器中具体数据
fs<<"]";表示之前的vector输入结束.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值