OpenCV cv.Mat與.txt檔案資料的讀寫操作

來源:互聯網
上載者:User
這篇文章主要介紹了OpenCV cv.Mat 與 .txt 檔案資料的讀寫操作,現在分享給大家,也給大家做個參考

1、按OpenCV格式實現的 .txt 檔案讀寫
可以用 cvSave 和 cvLoad 實現,格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的資料讀寫,還是用 .xml/.yml 檔案格式較好,我比較喜歡 .yml 格式,可讀性非常棒。
用 cvSave 和 cvLoad 讀寫 .txt 檔案,其實現方式和資料格式與 .yml 檔案基本一致。
例如:cvSave("camera_matrix.txt",camera_matrix); //儲存了 camera_matrix 的數組頭以及和它所指的data(類似yml形式的檔案)

2、匯入/匯出其它程式的 .txt 檔案資料
可以用常規的 sprintf_s 和 fprintf_s 來實現,不過效率比較低,這裡介紹一種快捷易用的方法,利用了 std 的 steam 和 vector。

#include <iostream> #include <fstream> #include <iterator> #include <vector>  using namespace std;  /*----------------------------  * 功能 : 將 cv::Mat 資料寫入到 .txt 檔案  *----------------------------  * 函數 : WriteData  * 訪問 : public  * 返回 : -1:開啟檔案失敗;0:寫入資料成功;1:矩陣為空白  *  * 參數 : fileName  [in]  檔案名稱  * 參數 : matData [in]  矩陣資料  */ int WriteData(string fileName, cv::Mat& matData) {   int retVal = 0;    // 開啟檔案   ofstream outFile(fileName.c_str(), ios_base::out); //按建立或覆蓋方式寫入   if (!outFile.is_open())   {     cout << "開啟檔案失敗" << endl;      retVal = -1;     return (retVal);   }    // 檢查矩陣是否為空白   if (matData.empty())   {     cout << "矩陣為空白" << endl;      retVal = 1;     return (retVal);   }    // 寫入資料   for (int r = 0; r < matData.rows; r++)   {     for (int c = 0; c < matData.cols; c++)     {       uchar data = matData.at<uchar>(r,c); //讀取資料,at<type> - type 是矩陣元素的具體資料格式       outFile << data << "\t" ;  //每列資料用 tab 隔開     }     outFile << endl; //換行   }    return (retVal); }   /*----------------------------  * 功能 : 從 .txt 檔案中讀入資料,儲存到 cv::Mat 矩陣  *   - 預設按 float 格式讀入資料,  *   - 如果沒有指定矩陣的行、列和通道數,則輸出的矩陣是單通道、N 行 1 列的  *----------------------------  * 函數 : LoadData  * 訪問 : public  * 返回 : -1:開啟檔案失敗;0:按設定的矩陣參數讀取資料成功;1:按預設的矩陣參數讀取資料  *  * 參數 : fileName  [in]  檔案名稱  * 參數 : matData [out]  矩陣資料  * 參數 : matRows [in]  矩陣行數,預設為 0  * 參數 : matCols [in]  矩陣列數,預設為 0  * 參數 : matChns [in]  矩陣通道數,預設為 0  */ int LoadData(string fileName, cv::Mat& matData, int matRows = 0, int matCols = 0, int matChns = 0) {   int retVal = 0;    // 開啟檔案   ifstream inFile(fileName.c_str(), ios_base::in);   if(!inFile.is_open())   {     cout << "讀取檔案失敗" << endl;     retVal = -1;     return (retVal);   }    // 載入資料   istream_iterator<float> begin(inFile);  //按 float 格式取檔案資料流的起始指標   istream_iterator<float> end;     //取檔案流的終止位置   vector<float> inData(begin,end);   //將檔案資料儲存至 std::vector 中   cv::Mat tmpMat = cv::Mat(inData);    //將資料由 std::vector 轉換為 cv::Mat    // 輸出到命令列視窗   //copy(vec.begin(),vec.end(),ostream_iterator<double>(cout,"\t"));     // 檢查設定的矩陣尺寸和通道數   size_t dataLength = inData.size();   //1.通道數   if (matChns == 0)   {     matChns = 1;   }   //2.行列數   if (matRows != 0 && matCols == 0)   {     matCols = dataLength / matChns / matRows;   }    else if (matCols != 0 && matRows == 0)   {     matRows = dataLength / matChns / matCols;   }   else if (matCols == 0 && matRows == 0)   {     matRows = dataLength / matChns;     matCols = 1;   }   //3.資料總長度   if (dataLength != (matRows * matCols * matChns))   {     cout << "讀入的資料長度 不滿足 設定的矩陣尺寸與通道數要求,將按預設輸出矩陣!" << endl;     retVal = 1;     matChns = 1;     matRows = dataLength;   }     // 將檔案資料儲存至輸出矩陣   matData = tmpMat.reshape(matChns, matRows).clone();      return (retVal); }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.