国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

OpenCV cv.Mat與.txt文件數據的讀寫操作

2020-01-26 13:43:17
字體:
來源:轉載
供稿:網友

本篇文章主要介紹了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); } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 广饶县| 尚志市| 监利县| 洛阳市| 沙洋县| 建宁县| 株洲市| 马公市| 句容市| 潼南县| 沾益县| 莱西市| 永顺县| 肇源县| 鄂伦春自治旗| 巴林左旗| 鹰潭市| 富蕴县| 广丰县| 巴林左旗| 逊克县| 嘉兴市| 梓潼县| 海原县| 塔城市| 徐汇区| 奉化市| 涿鹿县| 拜城县| 普宁市| 荥阳市| 葵青区| 星座| 宜兰市| 建水县| 通许县| 莆田市| 汉寿县| 宿松县| 南昌县| 阜南县|