- # 写入 .yml 格式文件
-
- # 1. 包含oepncv2/core.hpp头文件
-
- # 2. 创建文件流对象并且打开文件 cv::FileStorage
- FileStorage fs(.yml文件,FileStorage::WRITE)
-
- # 3. 写入数据
- # yml格式数据主要有五种类型:如下所示
- # (1) iterationNr: 100
- # (2)
- strings:
- - "image1.jpg"
- - Awesomeness
- - "../data/baboon.jpg"
- # (3)
- Mapping:
- One: 1
- Two: 2
- # (4)
- R: !!opencv-matrix
- rows: 3
- cols: 3
- dt: u
- data: [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]
- # (5)自定义类
-
- # 3.1 第(1)种的实现方式 (<< 本质是函数重载)
- fs << "iterationNr" << 100;
-
- # 3.2 第(2)种的实现方式 ([]括号是关键)
- fs << "strings" << "[";
- fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";
- fs << "]";
-
- # 3.3 第(3)种方式的实现 ({}括号是关键)
- fs << "Mapping";
- fs << "{" << "One" << 1;
- fs << "Two" << 2 << "}";
-
- # 3.4 第(4)种方式的实现 (R和T都是Mat类型)
- fs << "R" << R;
- fs << "T" << T;
-
- # 3.5 第(5)种方式的实现 (仅仅写入类的成员属性)
- 1. 创建一个类,必须包含 成员函数
- void write(FileStorage& fs) const
- 在write函数中按照3.3的方式往fs写入数据
-
- 2. 创建一个全局静态函数 (MyData就是我们希望保存的类)
- static void read(const FileNode& node, MyData& x, const MyData& default_value = MyData())
- {
- if(node.empty())
- x = default_value;
- else
- x.read(node);
- }
-
- 3. 至此,就可以用 f << "MyData" << 类实例化对象,的方式保存类数据
-
- # 4. 关闭文件流。
-
-
- # 从 .yml中读出数据
-
- # 1. 包含 opencv2/core.hpp头文件
-
- # 2. 创建FileStorage文件流对象
- cv::FileStorage fs;
-
- # 3. 打开文件
- fs.open(.yml文件, FileStorage::READ)
-
- # 4. 读出数据
- 与上面对应,也分5种方式读出数据
-
- # 4.1 读出 iterationNr: 100
- 变量名 = (int) fs["iterationNr"] // []也是函数符号重载,这个重载函数的返回类型是 FileNode
-
- # 4.2 读出 上面的第(2)格式的数据
- (1)首先创建 cv::FileNode 实例化对象 n
- (2)n = fs["iterationNr"]
- (3)建立 FileNodeIterator 迭代器
- (4)通过迭代器去一行一行地访问数据,记得转为(string)类型
-
- # 4.3 读出上面的第(3)种格式的数据
- (1)创建 cv::FileNode 实例化对象n
- (2)n=fs["Mapping"]
- (3)通过 (int)n["Two"]的方式得到键值对的value
-
- # 4.4 第(4)种类型逆过来就行
-
- # 4.5 第(5)种方式
- 1. 类成员函数必须包含
- void read(const FileNode& node)
- 里面按照4.3中的第(3)种方式取出数据赋值给当前类成员属性就可以
-
- 2. 类外必须有 就可以使用 fs["MyData"] >> m的方式传值
- static void write(FileStorage& fs, const std::string&, const MyData& x)
- {
- x.write(fs);
- }
-
-