1. 程式人生 > >OpenCV學習筆記(23)cv.Mat 與 .txt 檔案資料的讀寫操作

OpenCV學習筆記(23)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;

	// 檢查矩陣是否為空
	if (matData.empty())
	{
		cout << "矩陣為空" << endl; 
		retVal = 1;
		return (retVal);
	}

	// 開啟檔案
	ofstream outFile(fileName.c_str(), ios_base::out);	//按新建或覆蓋方式寫入
	if (!outFile.is_open())
	{
		cout << "開啟檔案失敗" << endl; 
		retVal = -1;
		return (retVal);
	}

	// 寫入資料
	for (int r = 0; r < matData.rows; r++)
	{
		for (int c = 0; c < matData.cols; c++)
		{
			int 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);
}

相關推薦

OpenCV學習筆記23cv.Mat .txt 檔案資料操作

1、按OpenCV格式實現的 .txt 檔案讀寫可以用 cvSave 和 cvLoad 實現,格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的資料讀寫,還是用  .xml/.yml 檔案格式較好,我比較喜歡 .yml 格式,可讀性非常棒。用 cvSave

OpenCv學習筆記cv::Mat學習

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OpenCV學習筆記04Mat類詳解

1. 前言:Mat類簡介 OpenCV 作為強大的計算機視覺開源庫,很大程度上參考了MatLab的實現細節和語法風格,比如說,在OpenCV2.x版本以後,越來越多的函式實現了MatLab所具有的功能,甚至乾脆連函式名都一模一樣(如 imre

openCV學習筆記7:cvRectanglecv::rectangle的用法

在第一次使用cvRectangle繪製矩形的時候遇到一個問題:Error:不存在從“cv::Mat”到"CvArr*"的適當轉換函式,就特意查了查資料,總結如下。 cvRentangle和cv::rectangle函式原型對比: C:       void cvRectan

opencv學習筆記-影象腐蝕腐蝕

相關概念: 腐蝕:刪除物件邊界某些畫素。 結構元素 設有兩幅圖象B,X。若X是被處理的物件,而B是用來處理X的,則稱B為結構元素(structure element),又被形象地稱做刷子。結構元素通常都是一些比較小的圖象。 +++++++++++++++

OpenCV學習筆記 cv.Mat .txt 檔案資料操作

1、按OpenCV格式實現的 .txt 檔案讀寫 可以用 cvSave 和 cvLoad 實現,格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的資料讀寫,還是用  .xml/.yml 檔案格式較好,我比較喜歡 .yml 格式,可讀性非常棒。 用

OpenCV學習筆記 cv.Mat .txt 檔案資料操作

1、按OpenCV格式實現的 .txt 檔案讀寫 可以用 cvSave 和 cvLoad 實現,格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的資料讀寫,還是用  .xml/.yml 檔案格式較好,我比較喜歡 .yml 格式,可讀性非常棒。 用

OpenCV學習筆記16雙目測距三維重建的OpenCV實現問題集錦影象獲取單目定標

雙目測距的基本原理 如上圖所示,雙目測距主要是利用了目標點在左右兩幅檢視上成像的橫向座標直接存在的差異(即視差)與目標點到成像平面的距離Z存在著反比例的關係:Z=fT/d。“@scyscyao :在OpenCV中,f的量綱是畫素點,T的量綱由定標板棋盤格的實際尺寸和使用者

opencv學習筆記-CvMat矩陣結構以及矩陣資料訪問

通道和維度 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 首先說一下對矩陣維度和通道的理解: 維:體現為座標。 通道

Android學習筆記35--- 使用sqlite 把.txt檔案導進.db

一、新建txt檔案,以一下固定格式儲存資料,如下: 1|1000|file:///system/kindergarten/item_main.html 2|1001|file:///system/kindergarten/item_main.html 3|1002|file

OpenCV學習筆記環境配置、影象基本操作Mat物件

     終於,在國慶假期結束後開始上手OpenCV,一直嚮往著學習影象處理,上手OpenCV後越發覺得影象處理的有趣,確實OpenCV對於培養學習影象處理的興趣以及作為深究演算法的開始無疑是適合的。      我所使用的環境是Win10+OpenCV3.4.3+VS201

python學習筆記23半成品的作業

lis 一位 bsp 循環 結果 只知道 color 這一 python學習 作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝! 原鏈:http://www.cnblogs.com/vamei/archive

Linux學習筆記23

23一、shell 基礎shell是個命令解釋器,提供用戶和機器之間的交互每個用戶都可以擁有自己特定的shellcentos7默認Shell為bash(Bourne Agin shell)除了bash,還有zsh.ksh等二、命令歷史敲過的命令在/root/.bash_history裏儲存著,最多可以儲存10

OpenCV學習筆記31KAZE 演算法原理原始碼分析KAZE的原始碼優化及SIFT的比較

  KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3.  Op

OpenCV學習筆記30KAZE 演算法原理原始碼分析KAZE特徵的效能分析比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

OpenCV學習筆記之影象畫素的提取

     提取影象的畫素及畫素索引 Mat src, dst; src = imread("mountainandwater.jpg"); //讀取影象 if (src.empty()) { qDebug()<<"can

Python + OpenCV 學習筆記>>> Numpy 陣列操作

將影象畫素迭代取反: import cv2 as cv import numpy as np def access_pixels(image): print(image.shape) height = image.shape[0]

Python + OpenCV 學習筆記>>> 載入視訊流

在這有一點要注意: 由於我使用的是樹莓派原裝攝像頭,故不能直接被cv.VideoCapture(0) 所檢測到,所以要先修改/etc/modules 檔案,在其末尾新增bcm2835-v4l2,儲存重啟,隨後在/dev/目錄中就能發現多了個video0 裝置 import cv2 a

Python + OpenCV 學習筆記>>> 影象的載入儲存

影象屬性: 通道數目 高與寬 畫素資料 影象型別 顯示一張圖片: import cv2 as cv src = cv.imread("/home/pi/Desktop/apple.jpg") cv.namedWindow("input im

OpenCv 學習筆記

一、cv::Mat image 建立一個寬和高都是0的影象,可以通過呼叫cv::Mat的size()方法來獲取該影象的尺寸,預設為0*0。 二、對一個影象檔案的讀取 cv::Mat pic; //mat類是用於儲存影象以及其他矩陣資料的資料結構,預設下,它的尺寸為了0