OpenCV3編程入門》第4章-學習筆記1-圖像容器Mat詳解">《OpenCV3編程入門》第4章-學習筆記1-圖像容器Mat詳解
756
2025-04-02
1.XML和YAML文件簡介
XML(eXtensible Markup Lauguage)是一種元標記語言,所謂的“元標記”就是開發者可以根據自身需要定義自己的標記。XML是一種語義/結構化語言,它描述了文檔的結構和語義
YAML(Ain’t a Markup Language)強調這種語言是以數據為中心的。YAML是一種可讀性高,用來表示資料序列的格式
總之,YAML試圖用一種比XML更敏捷的方式,完成XML所完成的任務
2.FileStorage 類操作文件的使用引導
我們一般使用如下過程來寫入或讀取數據到 XML 或 YAML 文件中
1.實例化一個FileStorage類的對象,用默認帶參數的構造函數完成初始化。或者用FileStorage::open()成員函數輔助初始化
2.使用流操作<<進行文件寫入操作,或者>>進行文件讀取操作。類似c++中的文件輸入輸出流
3.使用FileStorage::release()函數折構掉FileStorage類對象,同時關閉文件。
2.1 【第一步】XML、YAML文件打開
(1)準備文件寫操作
FileStorage是OpenCV中XML和YAML文件的存儲類,封裝了所有有關信息
構造函數為FileStorage::FileStorage ,有兩個重載
FileStorage::FileStorage()
FileStorage::FileStorage(const string& source ,int flags,const string& encoding=string)
實際中如何使用?(xml和yaml文件操作一致,下面使用方法換后綴后即可通用)
第一種:
FileStorage fs("abc.xml", FileStorage::WRITE);
第二種:
FileStorage fs;
fs.open("abc.xml", FileStorage::WRITE);
(2)準備文件讀操作
第一種:
FileStorage fs("abc.xml", FileStorage::READ);
第二種:
FileStorage fs;
fs.open("abc.xml", FileStorage::READ);
2.2?【第二步】進行讀寫操作
重定向符號: ?<< ? ?>>
2.3 【第三步】vector(arrays)和maps的輸入輸出
vector ?使用 ?[ ?]
maps ?使用 ? { ?}
fs << "string" <<"[";
fs <<"imgae1.jpg" <<"abs.jpg";
fs << "]";
//
fs <<"MAP";
fs <<"{"<<"gg"<<1;
fs <<"bb"<<2<<"}";
2.4 【第四步】文件關閉
fs.release(); ?//顯式關閉文件
3 ?示例程序:XML和YAML文件的寫入
#include
#include
using namespace cv;
int main() {
//初始化
//FileStorage fs("test.yaml", FileStorage::WRITE);
FileStorage fs("test.xml", FileStorage::WRITE);
//開始文件寫入
fs << "frameCount" << 5;
time_t rawtime;
time(&rawtime);
fs << "calibrationDate" << asctime(localtime(&rawtime));
Mat cameraMattrix = (Mat_
Mat distCoeffs = (Mat_
fs << "cameraMatrix" << cameraMattrix << "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();
std::cout << "文件讀寫完畢,請在工程目錄下查看生成的文件!";
getchar();
return(0);
}
運行結果:
假如把:
FileStorage fs("test.xml", FileStorage::WRITE); ?改為 ? FileStorage fs("test.yaml", FileStorage::WRITE);
4. XML 和 YAML 文件的讀取
#include
#include
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運算符>>
fs2["calibrationDate"] >> date;
Mat cameraMatrix2, distCoeffs2;
fs2["cameraMatrix"] >> cameraMatrix2;
fs2["distCoeffs"] >> distCoeffs2;
cout << "frameCount:" << frameCount << endl
<< "calibration date:" << date << endl
<<"camera matrix:"< << "distortion coeffs:" << distCoeffs2 << endl; FileNode features = fs2["features"]; FileNodeIterator it = features.begin(), it_end = features.end(); int idx = 0; vector //使用FileNodeIterator遍歷序列 for (; it != it_end; ++it, idx++) { cout << "feature #" << idx << ":"; cout << "x=" << (int)(*it)["x"] << ",y=" << (int)(*it)["y"] << ",lbp:("; //我們也可以使用filenode>>std::vector操作符來很容易的讀取陣列 (*it)["lbp"] >> lbpval; for (int i = 0; i < (int)lbpval.size(); i++) cout << " " << (int)lbpval[i]; cout << ")" << endl; } fs2.release(); printf("\n文件讀取完畢,輸入任意鍵結束程序!"); getchar(); return(0); } 工程目錄準備: 運行結果: OpenCV XML
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。