OpenCV的許多應用都需要使用數據的存儲於讀取,例如經過3D校准后的相機,需要存儲校准結果矩陣,以方便下次調用該數據;基於機器學習的應用,同樣需要將學習得到的參數保存等。OpenCV通過XML/YAML格式實現數據持久化。本文簡要梳理了使用FileStorage類進行基本數據持久化操作,給出了示例代碼。
主要內容包括:
FileStorage類
- 構造函數
- operator <<
- FileStorage::open
- FileStorage::isOpened
- FileStorage::release
- FileStorage::getFirstTopLevelNode
- FileStorage::root
- FileStorage::operator[]
示例代碼
- 創建寫入器、創建讀取器
- 寫入數值、寫入矩陣、寫入自定義數據結構、寫入當前時間
- 讀取數值、讀取矩陣、讀取自定義數據結構、讀取當前時間
- 關閉寫入器、關閉讀取器
FileStorage類
FileStorage類將各種OpenCV數據結構的數據存儲為XML 或 YAML格式。同時,也可以將其他類型的數值數據存儲為這兩種格式。
構造函數
FileStorage類的構造函數為:
cv::FileStorage(const string& source, int flags, const string& encoding=string());
參數:
source –存儲或讀取數據的文件名(字符串),其擴展名(.xml 或 .yml/.yaml)決定文件格式。
flags – 操作模式,包括:
- FileStorage::READ 打開文件進行讀操作
- FileStorage::WRITE 打開文件進行寫操作
- FileStorage::APPEND打開文件進行附加操作
- FileStorage::MEMORY 從source讀數據,或向內部緩存寫入數據(由FileStorage::release返回)
encoding – 文件編碼方式。目前不支持UTF-16 XML 編碼,應使用 8-bit 編碼。
寫數據operator <<
向filestorage中寫入數據
template<typename_Tp> FileStorage& operator<<(FileStorage& fs, const _Tp& value) template<typename_Tp> FileStorage& operator<<(FileStorage& fs, const vector<_Tp>& vec)參數:
fs – 已經打開的用於寫數據的file storage對象
value – 待寫入fs 的數據.
vec – 待寫入fs 的向量值
以下代碼分別演示寫入數值、矩陣、多個變量、當前時間和關閉文件:
// 1.create our writter cv::FileStorage fs("test.yml", FileStorage::WRITE); // 2.Save an int int imageWidth= 5; int imageHeight= 10; fs << "imageWidth" << imageWidth; fs << "imageHeight" << imageHeight; // 3.Write a Mat cv::Mat m1= Mat::eye(3,3, CV_8U); cv::Mat m2= Mat::ones(3,3, CV_8U); cv::Mat resultMat= (m1+1).mul(m1+2); fs << "resultMat" << resultMat; // 4.Write multi-variables cv::Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); cv::Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0); fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs; // 5.Save local time time_t rawtime; time(&rawtime); //#include <time.h> fs << "calibrationDate" << asctime(localtime(&rawtime)); // 6.close the file opened fs.release();
FileStorage::open
打開一個文件
boolFileStorage::open(const string& filename, int flags, const string&encoding=string())參數: filename – 待打開的文件名,其擴展名(.xml 或 .yml/.yaml) 決定文件格式(XML 或 YAML) flags – 操作模式。見構造函數 encoding – 文件編碼方式。// open a file cv::FileStorage fs; fs.open("test.yml",FileStorage::WRITE); // ... some process here fs.release();