OpenCV读写文件

#   写入 .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);
    }

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值