精华内容
下载资源
问答
  • FileStorage 文件读写操作

    千次阅读 2017-11-20 17:37:30
    本片博客重点利用FileStorage 进行文件读写操作练习; 创建一个common.hpp文件,存放结构体 #ifndef common_hpp #define common_hpp #include #include #include #include typedef struct my_struct { int m...

    本片博客重点利用FileStorage 进行文件读写操作练习;

    创建一个common.hpp文件,存放结构体

    #ifndef common_hpp
    #define common_hpp
    
    #include <stdio.h>
    #include <opencv2/opencv.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/core/core.hpp>
    typedef struct my_struct
    {
        int     m_value;
        CvPoint st_Point;
        CvRect  st_Rect;
    }MY_STRUCT;
    
    extern void write_my_struct(CvFileStorage * fs,const char * name,MY_STRUCT *ms);
    extern void read_my_struct(CvFileStorage * fs,CvFileNode * ms_node,MY_STRUCT *ms);

    创建main函数进行文件读写操作

     #include <iostream>
        #include "common.hpp"
    
        using namespace std;
        using namespace cv;
    
        void write_my_struct(FileStorage fs,const char *name,my_struct *mt)
        {
            fs <<name<< "[";//结构数组开始的标志
            fs<<"{:";//一个结构体开始的标志,yml才有:,xml自动忽略
            fs<<"val"<<mt->m_value;
            fs<<"ptx"<<mt->st_Point.x;
            fs<<"pty"<<mt->st_Point.y;
            fs<<"rtx"<<mt->st_Rect.x;
            fs<<"rty"<<mt->st_Rect.y;
            fs<<"}";//结构体结束的标志,自动换行
            fs << "]";//结构体数组结束的标志。
            
        }
    
        void read_my_struct(FileStorage fs,FileNode my_node,my_struct *mt)
        {
            
            FileNodeIterator fni = my_node.begin();
            FileNodeIterator fniEnd = my_node.end();
            for(;fni != fniEnd;fni++)//遍历
            {
                mt->m_value    = (int )(*fni)["val"];
                mt->st_Point.x = (int )(*fni)["ptx"];
                mt->st_Point.y = (int)(*fni) ["pty"];
                mt->st_Rect.x  = (int)(*fni) ["rtx"];
                mt->st_Rect.y  = (int)(*fni) ["rty"];
            }
        }
    
        int main(int argc, const char * argv[]) {
            const char filename[] = "OpenCV.yml";
            const char stname[]   = "My_Strcut";
            /*1.结构体初始化*/
            my_struct mt = {0};
            mt.m_value = 10;
            mt.st_Point.x = 20;
            mt.st_Point.y = 30;
            mt.st_Rect.x  = 40;
            mt.st_Rect.y  = 50;
            
            /*2.FileStorage文件写操作*/
            FileStorage fs(filename, FileStorage::WRITE);
            write_my_struct(fs,stname,&mt);
            fs.release(); //重要
            
            /*3.文件读操作*/
            cv::FileStorage fs2(filename,FileStorage::READ);
            FileNode features = fs2[stname];//读取结构体数组
            my_struct st_new = {0};
            read_my_struct(fs2,features,&st_new);
            fs2.release();
            
            /*4.显示读取结果*/
            cout<<st_new.m_value<<endl;
            cout<<st_new.st_Point.x<<endl;
            cout<<st_new.st_Point.y<<endl;
            cout<<st_new.st_Rect.x<<endl;
            cout<<st_new.st_Rect.y<<endl;
            return 0;
        }

    注意:

    写函数中Open.yml的存储位置:在xcode的工程Debug文件夹下


    该文件的存储 内容:


    读取文件的结果:


    展开全文
  • OpenCV FileStorage读写XML/YML文件  在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave()。在2.0以后的...

    转自:http://www.cnblogs.com/summerRQ/articles/2524560.html

            在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, 0, 320, 0, 1000, 240, 0, 0, 1); //又一种Mat初始化方式
        Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 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" << "[:";
            for( 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()对文件进行关闭

             例子如下:

    复制代码
        FileStorage fs("test.yml", FileStorage::READ);
    
        //方式一: []操作符
        int frameCount = (int)fs["frameCount"];
        
        //方式二: FileNode::operator >>()
        string date;
        fs["calibrationDate"] >> date;
        
        Mat cameraMatrix2, distCoeffs2;
        fs["cameraMatrix"] >> cameraMatrix2;
        fs["distCoeffs"] >> distCoeffs2;
        
        //注意FileNodeIterator的使用,似乎只能用一维数组去读取里面所有的数据
        FileNode features = fs["features"];
        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)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";
            (*it)["lbp"] >> lbpval;  //直接读出一维向量
    
            for( int i = 0; i < (int)lbpval.size(); i++ )
                cout << " " << (int)lbpval[i];
            cout << ")" << endl;
        }
        fs.release();
    复制代码

            另外,注意在新建FileStorage对象之后,并以READ或WRITE模式打开文件之后,可以用FileStorage::isOpened()查看文件状态,判断是否成功打开了文件。

    展开全文
  • /********************************************************************************************************************** ... 一个测试FileStorage读写运作方式的Demo 开发环境: OpenCv2.4.8 + VS2012
    /********************************************************************************************************************** 
    程序功能: 
            一个测试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;
    }

    展开全文
  •   ...FileStorage fs("test.yml", FileStorage::WRITE); fs &lt;&lt; "frameCount" &lt;&lt; 5; time_t rawtime; time(&amp;rawtime); fs &lt;...

    https://www.cnblogs.com/summerRQ/articles/2524560.html

     

    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, 0, 320, 0, 1000, 240, 0, 0, 1); //又一种Mat初始化方式
        Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 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" << "[:";
            for( int j = 0; j < 8; j++ )
                fs << ((lbp >> j) & 1);
            fs << "]" << "}";
        }
        fs << "]";
        fs.release();
    FileStorage fs("test.yml", FileStorage::READ);
    
        //方式一: []操作符
        int frameCount = (int)fs["frameCount"];
        
        //方式二: FileNode::operator >>()
        string date;
        fs["calibrationDate"] >> date;
        
        Mat cameraMatrix2, distCoeffs2;
        fs["cameraMatrix"] >> cameraMatrix2;
        fs["distCoeffs"] >> distCoeffs2;
        
        //注意FileNodeIterator的使用,似乎只能用一维数组去读取里面所有的数据
        FileNode features = fs["features"];
        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)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";
            (*it)["lbp"] >> lbpval;  //直接读出一维向量
    
            for( int i = 0; i < (int)lbpval.size(); i++ )
                cout << " " << (int)lbpval[i];
            cout << ")" << endl;
        }
        fs.release();

     

    展开全文
  • Opencv采用FileStorage读写xml文件。 用opencv进行人脸检测时可以看到opencv自带的人脸分类器实际上是一个个的xml文件。存放在安装路径下的opencv\data\haarcascades\的文件里。如下:
  • FileStorage文件读写 1.1 案例1-读取config变量 首先,在文件夹config下,新建一个文件config.yaml,其中内容如下: %YAML:1.0 # folder path folder_path: /home/*** #路径 我们现在希望可以在main函数中,...
  • Opencv基础之FileStorage读写操作

    千次阅读 2017-10-14 10:47:28
    FileStorage
  • javacv使用FileStorage读写xml文件

    千次阅读 2015-08-13 18:02:44
    javacv使用FileStorage读写xml文件,供需要的参考。 public static void main(String[] args) { /** * 写入文件 */ FileStorage fileStorageWrite = new FileStorage("writeArrzyString.xml",FileStorage....
  • 使用cv::FileStorage读写YAML文件

    千次阅读 2019-07-30 23:49:13
    #include <opencv2/opencv.hpp> #include <time.h> using namespace cv;... FileStorage fs("test.yaml", FileStorage::WRITE); fs << "frameCount" << 5; time...
  • FileStorageFileStorage类将各种OpenCV数据结构的数据存储为XML或YML格式。 构造函数:cv::FileStorage(const string&amp; source, int flags, const string&amp; encoding=string()); 参数说明: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 508
精华内容 203
关键字:

filestorage文件读写