OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作
一、Write_XML_and_YAML_File(写入XML)
#include <opencv2/opencv.hpp>
#include <time.h>
using namespace cv;
int main()
{
// 1、准备文件写操作
FileStorage fs("F:/C++/2. OPENCV 3.1.0/TEST/test.txt", FileStorage::WRITE);
// 2、开始文件写入
fs << "frameCount" << 5;
// 3、写入时间
time_t rawtime; // 64-bit time value
time(&rawtime);
fs << "calibrationDate" << asctime(localtime(&rawtime));
// 4、写入矩阵
Mat cameraMatrix = (Mat_<double>(3, 3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1);
Mat distCoeffs = (Mat_<double>(5, 1) << 0.1, 0.01, -0.001, 0, 0);
fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;
fs << "features" << "[";
// 5、写入随机数
for (int i = 0; i < 3; i++)
{
int x = rand() % 640; // 生成 640 随机数 x
int y = rand() % 480; // 生成 640 随机数 y
fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";
uchar lbp = rand() % 256; // 生成 256以内 随机数 lbp
//fs << "lbp" <<i<<lbp;
for (int j = 0; j < 8; j++)
fs << ((lbp >> j) & 1); // lbp 值右移 j 位(位运算)
fs << "]" << "}";
}
fs << "]";
fs.release();
printf("\n文件读写完毕,请在工程目录下查看生成的文件~");
getchar();
return 0;
}
运行结果:
1.写操作
二、Read_XML_and_YAML_File(读取XML)
#include <opencv2/opencv.hpp>
#include <time.h>
using namespace cv;
int main()
{
// 1、准备文件读操作
FileStorage fs2("F:/C++/2. OPENCV 3.1.0/TEST/test.yaml", FileStorage::READ);
// 2、第一种方法,对FileNode操作(节点操作)
// 获取整型数字
int frameCount = (int)fs2["frameCount"];
std::string date;
// 3、第二种方法,使用FileNode运算符> >
// 获取字符串
fs2["calibrationDate"] >> date;
// 4、获取矩阵
Mat cameraMatrix2, distCoeffs2;
fs2["cameraMatrix"] >> cameraMatrix2;
fs2["distCoeffs"] >> distCoeffs2;
// 5、控制台输出
cout << "frameCount: " << frameCount << endl
<< "calibration date: " << date << endl
<< "camera matrix: " << cameraMatrix2 << endl
<< "distortion coeffs: " << distCoeffs2 << endl;
// 6、声明文件节点迭代器
FileNode features = fs2["features"];
FileNodeIterator it = features.begin(), it_end = features.end();
std::vector<uchar> lbpval;
// 7、使用FileNodeIterator遍历序列
for(int idx = 0 ; it != it_end; ++it, idx++ )
{
cout << "feature #" << idx << ": ";
cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: (";
// 我们也可以使用使用filenode > > std::vector操作符很容易的读数值阵列
(*it)["lbp"] >> lbpval;// 读取数组
// 根据 lbpval.size() 读取数组lbp
for( int i = 0; i < (int)lbpval.size(); i++ )
cout << " " << (int)lbpval[i];
cout << ")" << endl;
}
fs2.release();
//程序结束,输出一些帮助文字
printf("\n文件读取完毕,请输入任意键结束程序~");
getchar();
return a.exec();
}
2.读操作: