OpenCv中FileStorage类读写XML文件的示例Demo

/********************************************************************************************************************** 
程序功能: 
        一个测试FileStorage类读写运作方式的Demo
开发环境: 
        OpenCv2.4.8 + VS2012 + Halocn10.0 + Win10
时间地点: 
        陕西师范大学 2016.10.9
作者信息: 
        九月----马卫飞 
***********************************************************************************************************************/  
#include <stdio.h>
#include <iostream>

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;

void help()
{
	std::cout<<"【1】【帮助信息】请在【项目】-->【属性】-->【调试】-->【命令参数】输入XXX.xml的文件名"<<std::endl;
	std::cout<<"【2】【帮助信息】此文件名就是我们将要使用cv::FileStorage的<<和>>操作符进行读写的XML文件"<<std::endl;
}
class MyData
{
public:
    MyData() : A(0), X(0), id()                                      //【1】带初始化列表的构造函数
    {}
    explicit MyData(int) : A(97), X(CV_PI), id("mydata1234")         //【2】显式的带初始化列表的构造函数         
    {}
    void write(FileStorage& fs) const                                //【3】常成员函数               
    {
        fs << "{" << "A" << A << "X" << X << "id" << id << "}";
    }
    void read(const FileNode& node)                         
    {
        A  = (int)node["A"];
        X  = (double)node["X"];
        id = (string)node["id"];
    }
public:   
    int    A;
    double X;
    string id;
};

void write(FileStorage& fs, const std::string&, const MyData& x)
{
    x.write(fs);
}

void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()){
    if(node.empty())
        x = default_value;
    else
        x.read(node);
}

ostream& operator<<(ostream& out, const MyData& m) 
{ 
    out << "{ id = " << m.id << ", ";
    out << "X = " << m.X << ", ";
    out << "A = " << m.A << "}";
    return out;
}
/*************************************************【Main函数】*********************************************************
*模块说明:
*        控制台应用程序的入口,我们的程序从此块开始执行
**********************************************************************************************************************/ 
int main(int argc, char** argv)
{
	    if(argc!=2)
		{
			help();
			std::system("pause");
			return -1;
		}

	    std::string strFileName = argv[1];

	    cv::Mat R = cv::Mat_<uchar>::eye(3,3);
		cv::Mat T = cv::Mat_<double>::zeros(3,1);

		MyData m(1);                                              //【0】调用带参数的构造函数

		cv::FileStorage fs;
		fs.open(argv[1],cv::FileStorage::WRITE);

		if(fs.isOpened())
		{
		   std::cout<<"【帮助信息】XML文件成功打开!"<<std::endl;
		}
		else
		{
			std::cout<<"【帮助信息】XML文件打开失败!"<<std::endl;
		}
		//=========================================================================================
		//模块说明:
		//        cv::FileStorage 写操作的Demo
		//=========================================================================================
		{
			fs<<"iterationNr"<<100;                            //【1】写基本的FileStorage结点数据
			fs<<"[";
			fs<<100;
			fs<<1000;
			fs<<"]";
			                                                     //【2】写Vector和数组类型的字符串序列
			fs<<"strings";
			fs<<"[";                                  
			fs<<"img1,jpg"<<"maweifei"<<"bound.png";
			fs<<"]";
			
			fs<<"Map";                                           //【3】写map类型结构的操作
			fs<<"{";
			fs<<"One"<<1;
			fs<<"Two"<<2;
			fs<<"}";
		         												 //【4】写cv::Mat矩阵结构数据
			fs<<"Rotation_Matrix";
			fs<<"[";
			fs << "R" << R;                                     
			fs<<"]";

			fs<<"Translation_Matrix";
			fs<<"[";                        
			fs<< T;  
			fs<<"]";
			                                                     //【5】写自己的数据类型
			fs << "MyData" << m;
			fs.release();                                        // explicit close  
			cout << "Write Done." << endl;  
		}
		std::system("pause");
		fs.release();

    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值