opencv_tutorial_code学习——XML\YAML文件IO操作

本文详细介绍如何使用OpenCV进行文件的读写操作,包括基本数值、字符串序列、映射及自定义数据类型的存储与读取。通过实例演示了如何定义自定义数据类型并实现其序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

From tutorial_code\core\file_input_output\file_input_output.cpp

存文件

string filename = "C:\\Users\\111\\Desktop\\1.xml";
FileStorage fs(filename, FileStorage::WRITE);
fs << "iterationNr" << 100;

读文件

fs.open(filename, FileStorage::READ);
fs["iterationNr"] >> itNr;
cout << itNr;

存String

fs << "strings" << "[";                              // text - string sequence
        fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";
        fs << "]";                                           // close sequence

读String

FileNode n = fs["strings"];                         // Read string sequence - Get node
        if (n.type() != FileNode::SEQ)
        {
            cerr << "strings is not a sequence! FAIL" << endl;
            return 1;
        }

        FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
        for (; it != it_end; ++it)
            cout << (string)*it << endl;

存Map

fs << "Mapping";                              // text - mapping
        fs << "{" << "One" << 1;
        fs <<        "Two" << 2 << "}";

读Map

n = fs["Mapping"];                                // Read mappings from a sequence
        cout << "Two  " << (int)(n["Two"]) << "; ";
        cout << "One  " << (int)(n["One"]) << endl << endl;

存自定义的变量类型:

1、先定义自己的变量类型:

class MyData
{
public:
    MyData() : A(0), X(0), id()
    {}
    explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion
    {}
    void write(FileStorage& fs) const                        //Write serialization for this class
    {
        fs << "{" << "A" << A << "X" << X << "id" << id << "}";
    }
    void read(const FileNode& node)                          //Read serialization for this class
    {
        A = (int)node["A"];
        X = (double)node["X"];
        id = (string)node["id"];
    }
public:   // Data Members
    int A;
    double X;
    string id;
};

2、重载read()和write()方法

static void write(FileStorage& fs, const std::string&, const MyData& x)
{
    x.write(fs);
}
static void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()){
    if(node.empty())
        x = default_value;
    else
        x.read(node);
}

3、重载运算符

static ostream& operator<<(ostream& out, const MyData& m)
{
    out << "{ id = " << m.id << ", ";
    out << "X = " << m.X << ", ";
    out << "A = " << m.A << "}";
    return out;
}

4、输入自己的变量类型

MyData m(1);
fs << "MyData" << m; 

5、输出自己的变量类型

MyData m;
fs["MyData"] >> m; 
cout << "MyData = " << endl << m << endl << endl;

6、输出未初始化的自己定义的变量类型

fs["NonExisting"] >> m;
cout << endl << "NonExisting = " << endl << m << endl;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值