OpenCV保存成XML(FileStorage)和CSV(重载<<运算符)文件
2015-04-25 21:24
866 查看
XML文件(使用FileStorage类)
使用OpenCV时不仅要保存影像结果,往往也需要保存中间的矩阵结果,而OpenCV的imwrite函数只支持CV8U类型的数据(使用OpenCV保存其他类型Mat的时候,程序不会报错,但是无法生成结果文件),因此会给工作带来很多不便。OpenCV在2.0以后的版本中提供了FileStorage类,供用户直接使用,保存为XML/YAML文件。保存XML
保存示例如下:Mat mat = Mat::eye(Size(12,12), CV_8UC1); FileStorage fs("f:\\vocabulary.xml", FileStorage::WRITE); fs << "vocabulary" << mat; fs.release();
得到结果文件如下所示:
<?xml version="1.0"?> <opencv_storage> <vocabulary type_id="opencv-matrix"> <rows>12</rows> <cols>12</cols> <dt>u</dt> <data> 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1</data></vocabulary> </opencv_storage>
需要注意的是,因为保存的结果为xml文件,所以再保存的时候需要给定标签,格式就是下面的形式,先存储标签内容,再存储矩阵:
fs << "vocabulary" << mat;
读取XML
同样使用FileStorage类可以直接获取保存的xml文件内容。读取示例如下:
FileStorage fs(".\\vocabulary.xml", FileStorage::READ); Mat mat_vocabulary; fs["vocabulary"] >> mat_vocabulary;
读取文件的时候同样要给定标签内容,这里通过中括号[]给定:
fs["vocabulary"] >> mat_vocabulary;
CSV文件
很多时候,直接使用CSV文件相比XML更方便,使用XML保存得到的数据,无论是查看(excel查看,XML中矩阵不是格式化的)还是接着使用别的工具处理(例如matlab),都可以快速的读取,而XML需要解析则比较繁琐。那么该如何保存CSV文件呢,对保存的CSV文件又应该如何读取呢,请看下文分解。保存CSV文件
OpenCV提供了结果保存的格式化函数format,使用format我们就可以根据自己想要的格式打印和保存数据了。先直接看保存函数,再来分析具体含义吧:
ofstream file("test.csv"); file << format(mat, Formatter::FMT_CSV); file.close();
根据上面的代码只用ofstream对象打开要写入的csv文件,再直接写入数据即可,需要注意的是,接入的矩阵用format格式化,format函数第二个参数表示格式类型,这里选择CSV格式即Formatter::FMT_CSV。
保存结果如图所示:
这里保存格式为定义在Formatter类中的枚举类型,总共有6中选项,各位读者可以根据自己的需求选择。
class CV_EXPORTS Formatter { public: enum { FMT_DEFAULT = 0, FMT_MATLAB = 1, FMT_CSV = 2, FMT_PYTHON = 3, FMT_NUMPY = 4, FMT_C = 5 }; virtual ~Formatter(); virtual Ptr<Formatted> format(const Mat& mtx) const = 0; virtual void set32fPrecision(int p = 8) = 0; virtual void set64fPrecision(int p = 16) = 0; virtual void setMultiline(bool ml = true) = 0; static Ptr<Formatter> get(int fmt = FMT_DEFAULT); };
读取CSV数据
在保存为CSV格式后该如何读取呢,这里可以使用OpenCV中ml模块的TrainData类的函数读取。具体代码如下所示,第二行为加载数据,参数0表示没有标题行,第三行获取得到的数据。Ptr<TrainData> train_data; train_data = TrainData::loadFromCSV("test.csv", 0); Mat m = train_data->getTrainSamples(); cout << format(m, Formatter::FMT_CSV) << endl;
代码运行结果为:
参考链接:
1. OpenCV使用FileStorage保存Mat数据
2. XML/YAML file storages. Writing to a file storage.
相关文章推荐
- OpenCV保存成XML(FileStorage)和CSV(重载<<运算符)文件
- OpenCV保存成XML(FileStorage)和CSV(重载<<运算符)文件
- OpenCV FileStorage类读写XML/YML文件
- Matlab读取xml文件——OpenCV通过FileStorage存储的矩阵Mat
- 关于web.xml中的<welcome-file-list>中的默认首页文件
- 关于web.xml中的<welcome-file-list>中的默认首页文件
- msxml3.dll 错误 '80070005' 保存XML文件错误
- win32汇编 屏幕截图保存BMP 学习笔记<第四篇>之生成BMP文件
- Opencv中调用FileStorage出现错误“Stack around the variable '*' was corrupted.”
- 自定义类重载运算符<< >>,并用FileStorage保存和读取xml文件
- XML 文件中 "< "提示办法 即DTD 文件的引入
- input type="file" 上传文件,若是flv格式,则截取保存一张图片asp.net
- spring applicationContext.xml 文件中<context:component-scan/>使用详解
- 程序中所不需要访问到的功能,别忘了从WMAppManifest.xml文件中的<Capabilities>的小节将它们去掉。
- C++的接口和重载<<运算符的小例子(试试把Circle的类的virtual的shapeName函数注释掉? )
- 关于web.xml中<welcome-file-list>
- <opencv学习 1>图像文件的读入与显示
- watch File System Events(文件系统改变事件监控) < 一 >
- openCV保存XML文件基本操作
- 读取xml文件转成List<T>对象的两种方法(附源码)