opencv學習筆記——FileStorage類的數據存取操作


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();  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM