opencv---FileStorage
来源:互联网 发布:淘宝有百度云盘吗 编辑:程序博客网 时间:2024/05/23 01:13
参考地址:
http://blog.csdn.net/jarvischu/article/details/8481510
《Learning opencv3》
完成功能
创建XML
向XML中存储或者是读取Int float型基本数据
通过创建XML元素,存取复杂的结构如:结构体、矩阵
基础知识
数据存在
opencv3提供一种机制用于序列化和去序列化,可以操作disk中的YAML文件或者XML文件。这些方式可以用于在一个文件中加载或者存储任何数量,任意类中的数据物体(包括基本的数据类型,etc:int,float)。FileStorage对象是最基本的读写文件的机制。
写入–CV::FileStorage对象
构造函数
1.
FileStorage();
这种构造函数,可以使用
FileStorage::open( string fileName, int flag );
2.
FileStorage(const String& source, int flags, const String& encoding=String());
- flag取值:
FileStorage::WRITE
FileStorage::READ
3.
FileStorage(CvFileStorage* fs, bool owning=true);
写入
1.
FileStorage中的数据存储方式有两种
- mapping(i.e key/value pairs)
- sequence(a series of unnamed entries)
在第一层,写入方式都是mapping,在第一层的mapping 中,你可以放置其它的mapping和sequence,深度没有任何限制
2.<<
使用操作符 <<进行写入
myFileStorage << "someInteger" << 27; // save an integermyFileStorage << "anArray" << cv::Mat::eye(3,3,CV_32F); // save an array
3.写入规则
为了使用sequence,你首先提供文件名,然后再进行操作。
你可以操作数(int,float..),string,以及任意 OpenCV数据类型.
如果需要创建新的mapping(sequence),需要{ 或者[来开始,
以}或者]来结束
myFileStorage << "theCat" << "{";myFileStorage << "fur" << "gray" << "eyes" << "green" << "weightLbs" << 16;myFileStorage << "}";
4.释放
cv::FileStorage::release()
读出—CV::FileStorage对象
函数原型
1.
FileStorage::FileStorage( string fileName, int flag );
flag需要被设置为FileStorage::READ
2.如果文件没有被打开,需要打开
FileStorage::open( string fileName, int flag );
读出方式
两种方式
1)[]
2)FileNodeIterator读出对象
1)从mapping 中读出,需要使用[]
2)从sequence中读出,需要[]- 返回对象
FileNode格式数据
FileNode
如果FileNode代表一个对象(或者number或者string),可以用>>来进行加载。
cv::Mat anArray;myFileStorage["calibrationMatrix"] >> anArray;
int aNumber;myFileStorage["someInteger"] >> aNumber;
int aNumber;aNumber = (int)myFileStorage["someInteger"];
opencv3版代码
#include "opencv2/opencv.hpp"#include <time.h>int main(int, char** argv){cv::FileStorage fs("test.yml", cv::FileStorage::WRITE);fs << "frameCount" << 5;time_t rawtime; time(&rawtime);fs << "calibrationDate" << asctime(localtime(&rawtime));cv::Mat cameraMatrix = (cv::Mat_<double>(3,3)<< 1000, 0, 320, 0, 1000, 240, 0, 0, 1);cv::Mat distCoeffs = (cv::Mat_<double>(5,1)<< 0.1, 0.01, -0.001, 0, 0);fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;fs << "features" << "[";for( int i = 0; i < 3; i++ ){int x = rand() % 640;Data Persistence | 199int 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();return 0;}
cv::FileStorage fs2("test.yml", cv::FileStorage::READ);// first method: use (type) operator on FileNode.int frameCount = (int)fs2["frameCount"];// second method: use cv::FileNode::operator >>//std::string date;fs2["calibrationDate"] >> date;cv::Mat cameraMatrix2, distCoeffs2;fs2["cameraMatrix"] >> cameraMatrix2;fs2["distCoeffs"] >> distCoeffs2;cout << "frameCount: " << frameCount << endl<< "calibration date: " << date << endl<< "camera matrix: " << cameraMatrix2 << endl<< "distortion coeffs: " << distCoeffs2 << endl;cv::FileNode features = fs2["features"];cv::FileNodeIterator it = features.begin(), it_end = features.end();int idx = 0;std::vector<uchar> lbpval;Data Persistence | 203// iterate through a sequence using FileNodeIteratorfor( ; it != it_end; ++it, idx++ ){cout << "feature #" << idx << ": ";cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";// ( Note: easily read numerical arrays using FileNode >> std::vector. )//(*it)["lbp"] >> lbpval;for( int i = 0; i < (int)lbpval.size(); i++ )cout << " " << (int)lbpval[i];cout << ")" << endl;}fs.release();
代码1- - -使用FileStorage操作 XML文件
#include "mainwindow.h"#include "opencv2/core/core.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/calib3d/calib3d.hpp"#include "opencv2/highgui/highgui.hpp"#include <QTextCodec>#include <iostream>#include <fstream>#include<opencv2/features2d/features2d.hpp>using namespace std;using namespace cv;MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ //创建XML文件存储 CvFileStorage* fs = cvOpenFileStorage("D:\\jarvischu.xml", 0, //用于存储的内存,如果为NULL,则会使用一个临时内存 CV_STORAGE_WRITE, "GB2312"//编码 ); //写入数据 cvWriteInt(fs,"frame_count",10); //--写Int cvWriteReal(fs,"pi",3.14); //--写Float //--写结构体 cvStartWriteStruct(fs,"frame_size",CV_NODE_MAP,"id_size" );// 有名称(会新建一个标签) cvWriteInt(fs,"width",320); cvWriteInt(fs,"height",200); cvEndWriteStruct(fs); cvStartWriteStruct(fs,"author_info",CV_NODE_SEQ,"id_author");// 无名称 cvWriteString(fs,0,"JarvisChu"); cvWriteString(fs,0,"China"); cvEndWriteStruct(fs); //--写矩阵 unsigned char vec[]={1,2,3,4,5,6,7,8,9}; CvMat mat = cvMat(3,3,CV_8UC1,vec); cvWrite(fs,"Matrix",&mat); //--写注释 cvWriteComment(fs,"This is a example for operatoring the xml file",0);//不为0表示放在当前行,0表示新行 //释放 cvReleaseFileStorage(&fs); //打开XML文件 fs = cvOpenFileStorage("jarvischu.xml", 0, //用于存储的内存,如果为NULL,则会使用一个临时内存 CV_STORAGE_READ, "GB2312"//编码 ); //读取数据 int f = cvReadIntByName(fs,0,"frame_count",0);//读取有名字的Int //--读取元素数据 CvFileNode* fn = cvGetFileNodeByName(fs,0,"frame_size"); //先读取父元素(标签,节点) int width = cvReadIntByName(fs,fn,"width"); //通过父元素读取子元素 int height = cvReadIntByName(fs,fn,"height"); //--读取元素内的顺序数据 fn = cvGetFileNodeByName(fs,0,"author_info");//先读取元素 CvSeq* seq = fn->data.seq; //获取元素的顺序流 const char* name = cvReadString((CvFileNode*)cvGetSeqElem(seq,0));//读取顺序流中数据 0 const char* country = cvReadString((CvFileNode*)cvGetSeqElem(seq,1));//读取顺序流中数据 1 cout<<"frame_count:"<<f<<endl<<"width:"<<width<<endl<<"height"<<height<<endl\ <<"name:"<<name<<endl<<"country:"<<country<<endl;}MainWindow::~MainWindow(){}
阅读全文
0 0
- opencv---FileStorage
- OpenCV FileStorage类学习
- OpenCV编程->FileStorage解析
- OpenCV中的FileStorage笔记
- opencv的FileStorage 类
- opencv的Filestorage,待学习
- opencv(二):FileStorage类
- OpenCV 数据存储FileStorage使用
- FileStorage
- OpenCV使用FileStorage保存Mat数据
- OpenCV使用FileStorage保存Mat数据 .
- OpenCV使用FileStorage保存Mat数据
- OpenCV FileStorage类读写XML/YML文件
- OpenCV FileStorage类读写XML/YML文件
- OpenCV使用FileStorage保存Mat数据
- Artificial Neural Networks && FileStorage of OpenCV
- OpenCV FileStorage类读写XML/YML文件
- OPENCV的FileStorage函数太贱了
- submit与button的区别
- Codeforces Round #407 (Div. 2)解题报告
- 在linux命令行下批量删除文件或文件夹
- 剑指offer 面试题40 数组中只出现一次的数字
- Kafka知识整理
- opencv---FileStorage
- 【Java学习笔记】23.网络编程--Socket
- Linux centos7 安装Hadoop单结点
- POJ 1278 BOAT 笔记
- 【React Native系列教程】构建React Native官方Examples
- scanf读取带有空格的字符串
- Java基础[5]-1-this和super;静态和动态绑定;equals与hashCode和toString
- UVa 10954 Add All ——优先队列
- Linux Command Line and....ch1(初识linux)