欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年05月03日 12:06:58   作者:可樂洋芋頭  
這篇文章主要介紹了OpenCV cv.Mat 與 .txt 文件數據的讀寫操作,現在分享給大家,也給大家做個參考

本篇文章主要介紹了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 文件數據

可以用常規(guī)的 sprintf_s 和 fprintf_s 來實現,不過效率比較低,這里介紹一種快捷易用的方法,利用了 std 的 steam 和 vector。

#include <iostream> 
#include <fstream> 
#include <iterator> 
#include <vector> 
 
using namespace std; 
 
/*---------------------------- 
 * 功能 : 將 cv::Mat 數據寫入到 .txt 文件 
 *---------------------------- 
 * 函數 : WriteData 
 * 訪問 : public 
 * 返回 : -1:打開文件失?。?:寫入數據成功;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); 
} 

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

相關文章

  • C語言實現多項式的相加

    C語言實現多項式的相加

    這篇文章主要為大家介紹了C語言實現多項式的相加,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Qt?Creator配置opencv環(huán)境的全過程記錄

    Qt?Creator配置opencv環(huán)境的全過程記錄

    最近在PC端QT下配置opencv,想著以后應該會用到,索性記錄下,這篇文章主要給大家介紹了關于Qt?Creator配置opencv環(huán)境的相關資料,需要的朋友可以參考下
    2022-05-05
  • 一起來了解c語言的str函數

    一起來了解c語言的str函數

    這篇文章主要為大家詳細介紹了c語言的str函數,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言函數的參數使用指針

    C語言函數的參數使用指針

    這篇文章主要介紹了C語言函數的參數使用指針,本文講述了指針在作為函數參數時候的使用方法,解析值傳遞和值引用的區(qū)別案例,希望對你有所幫助
    2021-06-06
  • 詳解C++ STL模擬實現forward_list

    詳解C++ STL模擬實現forward_list

    forward_list是C++ 11新增的容器,它支持從容器中的任何位置快速插入和移除元素的容器,不支持快速隨機訪問。本文將模擬實現forward_list,感興趣的可以了解一下
    2023-01-01
  • c++中的bind使用方法

    c++中的bind使用方法

    bind是這樣一種機制,它可以預先把指定可調用實體的某些參數綁定到已有的變量,產生一個新的可調用實體,這種機制在回調函數的使用過程中也頗為有用。接下來通過本文給大家介紹c++中的bind使用方法,感興趣的朋友一起看看吧
    2022-01-01
  • C++ 微信多開的實現

    C++ 微信多開的實現

    本文主要介紹了C++ 微信多開的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++實現簡單圖書館管理系統(tǒng)

    C++實現簡單圖書館管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現簡單圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++用兩個棧實現一個隊列(面試官的小結)

    C++用兩個棧實現一個隊列(面試官的小結)

    這篇文章主要給大家介紹了關于C++用兩個棧實現一個隊列的相關資料,這是來自一名面試官的小結,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • C++迭代器介紹(iterator、const_iterator、reverse_interator、const_reverse_interator)

    C++迭代器介紹(iterator、const_iterator、reverse_interator、const_rev

    這篇文章主要介紹了C++迭代器介紹(iterator、const_iterator、reverse_interator、const_reverse_interator),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02

最新評論