OpenCV(cv::FileStorage())



cv::FileStorage() 是 OpenCV 提供的一个用于读写文件的类,主要用于读取和写入结构化数据(如 XML、YAML 或 JSON 文件)。它是用于在文件和内存之间存储和检索复杂数据结构的工具,例如矩阵、向量、标量或自定义的结构化数据。

1. 功能

  • 写文件:将结构化数据(如 cv::Mat 矩阵、标量、向量等)保存到 XML、YAML 或 JSON 文件中。
  • 读文件:从 XML、YAML 或 JSON 文件中加载数据。


2. 方法和用法

  1. 构造函数

    • cv::FileStorage():创建一个空的 FileStorage 对象。
    • cv::FileStorage(const std::string &filename, int flags):根据指定的文件名和标志打开文件。标志可以是 cv::FileStorage::READ(读取模式)或 cv::FileStorage::WRITE(写入模式)。
  2. 常用标志

    • cv::FileStorage::READ:打开文件进行读取。
    • cv::FileStorage::WRITE:打开文件进行写入。
    • cv::FileStorage::APPEND:追加模式。
    • cv::FileStorage::MEMORY:用于将文件存储到内存中。
  3. 读写数据

    • 写入

      • 使用 << 运算符将数据写入文件。
      • 格式为 fs << "name" << value;,其中 "name" 是数据的标签,value 是要写入的数据。
      • 可以写入的类型包括标量、向量、cv::Mat、结构体等。
    • 读取

      • 使用 >> 运算符读取数据。
      • 格式为 fs["name"] >> value;,其中 "name" 是数据的标签,value 是存储读取数据的变量。
  4. 打开和释放文件

    • fs.open(const std::string &filename, int flags):用于打开文件。与构造函数类似,根据标志指定是读还是写。
    • fs.release():关闭文件。
  5. 文件节点访问

    • 文件存储的数据以树形结构组织,使用 cv::FileNode 类来访问这些节点。
    • 可以通过 fs["name"] 的方式访问节点,然后使用 >> 运算符读取数据。
  6. 检查文件状态

    • isOpened():检查文件是否成功打开。
    • release():关闭当前打开的文件。


3. 示例

3.1 写入数据

cv::FileStorage fs("output.yml", cv::FileStorage::WRITE);

// 写入标量
int age = 25;
fs << "Age" << age;

// 写入矩阵
cv::Mat mat = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
fs << "Matrix" << mat;

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

3.2 读取数据

cv::FileStorage fs("output.yml", cv::FileStorage::READ);

int age;
cv::Mat mat;

fs["Age"] >> age;
fs["Matrix"] >> mat;

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


4. 常见数据格式

  1. XML

    <?xml version="1.0"?>
    <opencv_storage>
    <Age>25</Age>
    <Matrix type_id="opencv-matrix">
      <rows>3</rows>
      <cols>3</cols>
      <dt>i</dt>
      <data>
        1 2 3 4 5 6 7 8 9
      </data></Matrix>
    </opencv_storage>
    
  2. YAML

    %YAML:1.0
    Age: 25
    Matrix: !!opencv-matrix
      rows: 3
      cols: 3
      dt: i
      data: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    
  3. JSON

    {
      "Age": 25,
      "Matrix": {
        "rows": 3,
        "cols": 3,
        "dt": "i",
        "data": [1, 2, 3, 4, 5, 6, 7, 8, 9]
      }
    }
    


5. 注意事项

  • cv::FileStorage 适用于存储较大的结构化数据,例如配置文件、模型参数等。
  • 数据的标签(name)必须唯一,读取时依赖于该标签来检索数据。
  • 文件的格式可以由文件扩展名(.xml.yml.json)自动检测,也可以手动指定。


6. 总结

cv::FileStorage() 是 OpenCV 中非常强大而灵活的工具,能够有效地处理复杂的结构化数据,使读写文件更加方便。它适用于需要持久化存储 OpenCV 数据的场景,如保存和加载训练模型、图像数据以及应用程序的配置文件。



posted @   做梦当财神  阅读(286)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2021-08-23 数据降维
点击右上角即可分享
微信分享提示