参考链接:https://blog.csdn.net/wonder233/article/details/52810458
https://blog.csdn.net/coma_6512/article/details/78232649
成员函数
operator <<
FileStorage::open
FileStorage::isOpened
FileStorage::release
FileStorage类将各种OpenCV数据结构的数据存储为XML 或 YML格式。
构造函数
cv::FileStorage(const string& source, int flags, const string& encoding=string());
source –存储或读取数据的文件名(字符串),其扩展名(.xml 或 .yml或者.yaml)决定文件格式。
flags – 操作方式,包括:
FileStorage::READ 打开文件进行读操作
FileStorage::WRITE 打开文件进行写操作
FileStorage::APPEND打开文件进行附加操作,在已有内容的文件里添加
encoding—编码方式,用默认值就好。
FileStorage类的使用流程如下:
(1)实例化一个FileStorage类对象
(2)使用流操作符<<进行文件写入,>>进行文件读取,类似C++中的文件操作
(3)使用FileStorage::release()函数析构掉类对象,并关闭文件
下面是写操作的例子:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
FileStorage file_("1.yml", FileStorage::WRITE);
int num1 = 1, num2 = 2;
file_<<"num1"<<num1;
file_<<"num2"<<num2;
Mat A(4,5,CV_32FC1,Scalar(10));
file_<<"A"<<A;
file_.release();
}
输出1.yml文件内容为:
%YAML:1.0
---
num1: 1
num2: 2
A: !!opencv-matrix
rows: 4
cols: 5
dt: f
data: [ 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10., 10.,
10., 10., 10., 10., 10., 10., 10., 10. ]
特别注意!
file_<<"num1"<<num1;
输入的是标签,这里如果写成file_<<"num1:"<<num1; 就会报错。
OpenCV Error: Bad argument (Key names may only contain alphanumeric characters [a-zA-Z0-9], '-', '_' and ' ') in icvYMLWrite
不要画蛇添足加个冒号。
下面是读操作的例子:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
FileStorage fs_ ("1.yml", FileStorage::READ);
int r1, r2;
fs_["num1"]>>r1;
fs_["num2"]>>r2;
Mat A(4,5,CV_32FC1);
fs_["A"]>>A;
cout<< "r1 :"<<r1<<endl;
cout<< "r2 :"<<r2<<endl;
cout<< "A :"<<"\n"<<A<<endl;
fs_.release();
}
这里fs_["num1"] 方括号里面的内容就是 写操作时我们给数据添加的标签
输出:
r1 :1
r2 :2
A :
[10, 10, 10, 10, 10;
10, 10, 10, 10, 10;
10, 10, 10, 10, 10;
10, 10, 10, 10, 10]