首頁 後端開發 Python教學 OpenCV cv.Mat與.txt檔案資料的讀寫操作

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

May 03, 2018 pm 01:51 PM
opencv

這篇文章主要介紹了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); 
}
登入後複製

相關建議:

python3.4.3下逐行讀入txt文字並去重的方法

以上是OpenCV cv.Mat與.txt檔案資料的讀寫操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用pip軟體套件管理器快速安裝OpenCV學習指南 使用pip軟體套件管理器快速安裝OpenCV學習指南 Jan 18, 2024 am 09:55 AM

使用pip命令輕鬆安裝OpenCV教程,需要具體程式碼範例OpenCV(OpenSourceComputerVisionLibrary)是一個開源的電腦視覺庫,它包含了大量的電腦視覺演算法和函數,可以幫助開發者快速建立圖像和視訊處理相關的應用程式。在使用OpenCV之前,我們需要先安裝它。幸運的是,Python提供了一個強大的工具pip來管理第三方函式庫

python OpenCV影像金字塔實例分析 python OpenCV影像金字塔實例分析 May 11, 2023 pm 08:40 PM

1.影像金字塔理論基礎影像金字塔是影像多尺度表達的一種,是一種以多重解析度來解釋影像的有效但概念簡單的結構。一幅圖像的金字塔是一系列以金字塔形狀排列的解析度逐步降低,且來自同一張原始圖的圖像集合。其透過梯次向下採樣獲得,直到達到某個終止條件才停止採樣。我們將一層一層的圖像比喻成金字塔,層級越高,則影像越小,解析度越低。那我們為什麼要做圖像金字塔呢?這就是因為改變像素大小有時候並不會改變它的特徵,比方說給你看1000萬像素的圖片,你能知道裡面有個人,給你看十萬像素的,你也能知道裡面有個人,但是對計

OpenCV安裝教學:PyCharm用戶必看 OpenCV安裝教學:PyCharm用戶必看 Feb 22, 2024 pm 09:21 PM

OpenCV是一種用於電腦視覺和影像處理的開源庫,廣泛應用於機器學習、影像辨識、視訊處理等領域。在使用OpenCV進行開發時,為了能夠更好地調試和運行程序,許多開發者選擇使用PyCharm這款強大的Python整合開發環境。本文將為PyCharm用戶提供OpenCV的安裝教學課程,並附上具體的程式碼範例。第一步:安裝Python首先,請確保您已經安裝了Python

Python+OpenCV怎麼實現拖曳虛擬方塊效果 Python+OpenCV怎麼實現拖曳虛擬方塊效果 May 15, 2023 pm 07:22 PM

一、專案效果二、核心流程1、openCV讀取視訊串流、在每一幀圖片上畫出一個矩形。 2.使用mediapipe取得手指關鍵點座標。 3.根據手指座標位置和矩形的座標位置,判斷手指點是否在矩形上,如果在則矩形跟隨手指移動。三、程式碼流程環境準備:python:3.8.8opencv:4.2.0.32mediapipe:0.8.10.1註:1、opencv版本過高或過低可能出現一些如鏡頭打不開、閃退等問題,python版本影響opencv可選擇的版本。 2、pipinstallmediapipe後可能導致op

如何使用Java在OpenCV中繪製箭頭的線條? 如何使用Java在OpenCV中繪製箭頭的線條? Aug 20, 2023 pm 02:41 PM

JavaOpenCV函式庫的org.opencv.imgproc套件包含一個名為Imgproc的類,該類別提供了各種方法來處理輸入影像。它提供了一組在圖像上繪製幾何形狀的方法。要繪製一個帶有箭頭的線條,您需要呼叫這個類別的arrowedLine()方法。此方法接受以下參數:表示要在其上繪製線條的影像的Mat物件。表示線條之間的兩點的Point物件。 drawn.表示線條顏色的Scalar物件。 (BGR)表示線條厚度的整數(預設值:1)。範例importorg.opencv.core.Core;importo

如何使用PHP和OpenCV庫實現視訊處理? 如何使用PHP和OpenCV庫實現視訊處理? Jul 17, 2023 pm 09:13 PM

如何使用PHP和OpenCV庫實現視訊處理?摘要:在現代科技應用中,視訊處理已成為一項重要的技術。本文將介紹如何使用PHP程式語言結合OpenCV函式庫來實作一些基本的視訊處理功能,並附上對應的程式碼範例。關鍵字:PHP、OpenCV、視訊處理、程式碼範例引言:隨著網路的發展和智慧型手機的普及,影片內容已成為人們生活中不可或缺的一部分。然而,要實現影片的編輯和

在Python中,可以使用OpenCV庫中的方法對影像進行分割和提取。 在Python中,可以使用OpenCV庫中的方法對影像進行分割和提取。 May 08, 2023 pm 10:55 PM

影像分割與擷取影像中將前景物件作為目標影像分割或提取出來。背景本身並無興趣分水嶺演算法及GrabCut演算法對影像進行分割及擷取。用分水嶺演算法實現影像分割與提取分水嶺演算法將影像形象化為地理上的地形表面,實現影像分割,該演算法非常有效。演算法原理任何一幅灰階影像,都可以被視為地理學上的地形表面,灰階值高的區域可以被看成是山峰,灰階值低的區域可以被看成是山谷。左圖是原始影像,右圖是其對應的「地形表面」。過程將影像分成兩個不同的集合:集水盆地和分水嶺線。我們建造的堤防就是分水嶺線,也即對原始影像

新手請看:詳細教學如何在PyCharm中安裝OpenCV 新手請看:詳細教學如何在PyCharm中安裝OpenCV Feb 26, 2024 pm 03:24 PM

PyCharm是一款由JetBrains公司開發的強大的Python整合開發環境(IDE),提供了豐富的功能和工具來幫助Python開發者編寫程式碼、除錯程式以及管理專案。在PyCharm中使用OpenCV這一強大的電腦視覺庫,可以輕鬆地進行影像處理、視訊處理等任務。本文將詳細介紹在PyCharm中安裝和設定OpenCV的步驟,並提供具體的程式碼範例。 1.安

See all articles