《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件
第5章 Core組件進(jìn)階
5.6 輸入輸出XML和YAML文件
5.6.1 XML和YAML文件
XML和YAML是使用非常廣泛的文件格式,可以利用XML或者YAML式的文件存儲和還原各種數(shù)據(jù)結(jié)構(gòu),還可以存儲和載入任意復(fù)雜數(shù)據(jù)結(jié)構(gòu)
1.XML(Extensible Markup Language):可擴(kuò)展標(biāo)記語言,元標(biāo)記語言,語義/結(jié)構(gòu)化語言
2.YAML(YAML Ain’t a Markuo Language):YAML不是一種置標(biāo)語言,可讀性高,用來表達(dá)資料序列的格式,試圖以一種比XML更敏捷的方式完成任務(wù),后綴名(.yml和.yaml)
5.6.2 FileStorage類操作文件
一般過程:
(1)實(shí)例化一個FileStorage類的對象,用默認(rèn)帶參數(shù)的構(gòu)造函數(shù)完成初始化,或者用FileStorage::open()成員函數(shù)輔助初始化
(2)使用流操作符<<進(jìn)行文件寫入,或者>>進(jìn)行文件讀取
(3)使用FileStorage::release()函數(shù)析構(gòu)FileStorage類對象,同時關(guān)閉文件
1.XML、YAML文件打開
FileStorage是XML和YAML文件的存儲類,構(gòu)造函數(shù)有兩個重載:
FileStorage::FileStorage()
FileStorage::FileStorage(const string& source,int flags,const string& encoding=string())
(1)準(zhǔn)備文件寫操作
①對于帶參數(shù)構(gòu)造函數(shù)
FileStorage fs(“abc.xml”,FileStorage::WRITE);
②對于不帶參數(shù)構(gòu)造函數(shù),可使用成員函數(shù)FileStorage::open數(shù)據(jù)寫操作
FileStorage fs;
fs.open(“abc.xml”,FileStorage::WRITE);
(2)準(zhǔn)備文件讀操作
①對于帶參數(shù)構(gòu)造函數(shù)
FileStorage fs(“abc.xml”,FileStorage::READ);
②對于不帶參數(shù)構(gòu)造函數(shù),可使用成員函數(shù)FileStorage::open數(shù)據(jù)讀操作
FileStorage fs;
fs.open(“abc.xml”,FileStorage::READ);
2.文件讀寫操作
(1)文本和數(shù)字讀寫
fs << “iterationNr” << 100; //寫入
int itNr;
fs [“iterationNr”] >> itNr; //讀取
itNr = (int) fs[“iterationNr”];
(2)OpenCV數(shù)據(jù)結(jié)構(gòu)讀寫
//數(shù)據(jù)結(jié)構(gòu)初始化
Mat R = Mat_<uchar>::eye(3,3);
Mat T = Mat_<uchar>::zeros(3,1);
//向Mat中寫入數(shù)據(jù)
fs << “R” <<R;
fs << ”T” <<T;
//從Mat中讀取數(shù)據(jù)
fs[“R”] >> R;
Fs[“T”] >>T;
3.vector(arrays)和maps的輸入和輸出
(1)vector結(jié)構(gòu):注意在第一個元素前加上“[”,在最后一個元素后加上“]”
fs << “strings” <<”[“; //開始讀入string文本序列
fs << ”image1.jpg” << “Awesomeness” << “baboon.jpg”;
fs << ”Two” << 2 << “]”;
(2)map結(jié)構(gòu):“{”和“}”
fs << “Mapping”; //開始讀入Mapping文本
fs << “{“ << “One” <<1;
fs << “Two” << 2 << “}”;
(3)讀取結(jié)構(gòu)用FileNode和FileNodeIterator數(shù)據(jù)結(jié)構(gòu),對FileStorage類的“[”、“]”操作符會返回FileNode數(shù)據(jù)類型,對于一連串的node,可以使用FileNodeIterator結(jié)構(gòu),例如:
FileNode n = fs[“strings”]; //讀取字符串序列以得到節(jié)點(diǎn)
if (n.type() != FileNode::SEQ)
{
cerr << “發(fā)生錯誤!字符串不是一個序列!” << endl;
return 1;
}
FileNodeIterator it = n.begin(), it_end = n.end(); //遍歷節(jié)點(diǎn)
for( ; it != it_end; ++it )
cout << (string)*it <<endl;
4.文件關(guān)閉
文件關(guān)閉操作會在FileStorage類銷毀時自動進(jìn)行,也可顯式調(diào)用析構(gòu)函數(shù)FileStorage::release()實(shí)現(xiàn):
fs.release();
5.6.3 示例程序:XML和YAML文件寫入
#include<opencv2/opencv.hpp>
#include<time.h>
using namespace cv;
using namespace std;int main()
{//初始化FileStorage fs("test.yaml", FileStorage::WRITE);//開始文件寫入fs << "frameCount" << 5;//time_t rawtime;//time(&rawtime);//fs << "callbrationDate" << asctime(localtime(&rawtime));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" << "[";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();printf("文件讀寫完畢,請?jiān)诠こ棠夸浵虏榭瓷傻奈募");getchar();waitKey(0);return 0;
}
5.6.4 示例程序:XML和YAML文件讀取
#include<opencv2/opencv.hpp>
#include<time.h>
using namespace cv;
using namespace std;int main()
{//改變console字體顏色//system("color 6F");//初始化FileStorage fs2("test.yaml", FileStorage::READ);//第一種方法,對FileNode操作int frameCount = (int)fs2["frameCount"];//std::string date;//第二種方法,使用FileNode運(yùn)算符>>//fs2["calibrationDate"] >> date;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;FileNode features = fs2["features"];FileNodeIterator it = features.begin(), it_end = features.end();int idx = 0;std::vector<uchar>lbpval;//使用FileNodeIterator遍歷序列for (;it != it_end; ++it, idx++){cout << "feature #" << idx << ":";cout << "x=" << (int)(*it)["x"] << ",y=" << (int)(*it)["y"] << ",lbp:(";//也可以使用filenode>>std::vector操作符很容易地讀數(shù)值陣列(*it)["lbp"] >> lbpval;for (int i = 0; i < (int)lbpval.size(); i++){cout << " " << (int)lbpval[i];}cout << ")" << endl;}fs2.release();//程序結(jié)束,輸出一些幫助文字printf("\n 文件讀取完畢,請輸入任意鍵結(jié)束程序~");getchar();return 0;
}
總結(jié)
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《OpenCV3编程入门》学习笔记5 C
- 下一篇: 算法设计与分析第5章 回溯法(一)【回溯