openCv XML/YML

在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave()。在2.0以后的OpenCV转为支持C++,这一举措大大减少了代码量以及编程时需要考虑的细节。

新版本的OpenCV的C++接口中,imwrite()和imread()只能保存整数数据,且需要以图像格式。当需要保存浮点数据或者XML/YML文件时,之前的C语言接口cvSave()函数已经在C++接口中被删除,代替它的是FileStorage类。这个类非常的方便,封装了很多数据结构的细节,编程的时候可以根据统一的接口对数据结构进行保存。

1. FileStorage类写XML/YML文件

•新建一个FileStorage对象,以FileStorage::WRITE的方式打开一个文件。

• 使用 << 操作对该文件进行操作。

•释放该对象,对文件进行关闭。

例子如下:

    FileStorage fs("test.yml",FileStorage::WRITE);
    fs << frameCount" << 5;
    time_t rawtime; time(&rawtime);
    fs << calibrationDate" << asctime(localtime(&rawtime));
    Mat cameraMatrix = (Mat_<double>(3,3) << 1000,128); line-height:1.5!important">0,128); line-height:1.5!important">320,128); line-height:1.5!important">240,128); line-height:1.5!important">1); //又一种Mat初始化方式
    Mat distCoeffs = (Mat_<5,128); line-height:1.5!important">1) << 0.1,128); line-height:1.5!important">0.01,-0.001,128); line-height:1.5!important">0);
    fs << cameraMatrix" << cameraMatrix << distCoeffs" << distCoeffs;
    
    features为一个大小为3的向量,其中每个元素由随机数x,y和大小为8的uchar数组组成
    fs << features[";
    for( int i = 0; i < 3; i++ )
    {
        int x = rand() % 640;
        int y = rand() % 480;
        uchar lbp = rand() % 256;
        fs << {:x" << x << y" << y << lbp[:";
        int j = 0; j < 8; j++ )
            fs << ((lbp >> j) & 1);
        fs << ]}";
    }
    fs << ";
    fs.release();

2. FileStorage类读XML/YML文件

FileStorage对存储内容在内存中是以层次的节点组成的,每个节点类型为FileNode,FileNode可以使单个的数值、数组或者一系列FileNode的集合。FileNode又可以看做是一个容器,使用iterator接口可以对该节点内更小单位的内容进行访问,例如访问到上面存储的文件中"features"的内容。步骤与写文件类似:

• 新建FileStorage对象,以FileStorage::READ 方式打开一个已经存在的文件

• 使用FileStorage::operator []()函数对文件进行读取,或者使用FileNode和FileNodeIterator

• 使用FileStorage::release()对文件进行关闭

方式一: []操作符 int frameCount = (int)fs["]; 方式二: FileNode::operator >>() string date; fs["] >> date; Mat cameraMatrix2,distCoeffs2; fs["] >> cameraMatrix2; fs["] >> distCoeffs2; 注意FileNodeIterator的使用,似乎只能用一维数组去读取里面所有的数据 FileNode features = fs["]; FileNodeIterator it = features.begin(),it_end = features.end(); int idx = 0; std::vector<uchar> lbpval; for( ; it != it_end; ++it,idx++ ) { cout << feature #" << idx << : "; cout << x=" << (int)(*it)["] << ,y="; (*it)["] >> lbpval; 直接读出一维向量 0; i < (int)lbpval.size(); i++ ) cout << " int)lbpval[i]; cout << )" << endl; } fs.release();


http://blog.csdn.net/jarvischu/article/details/8481510

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇