# 写入 .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); }
OpenCV读写文件
最新推荐文章于 2023-07-02 18:01:01 发布