日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件

發(fā)布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。