OpenCV cv.Mat與.txt文件數(shù)據(jù)的讀寫操作
本篇文章主要介紹了OpenCV cv.Mat 與 .txt 文件數(shù)據(jù)的讀寫操作,小編覺得挺不錯的,現(xiàn)在分享給大家。
1、按OpenCV格式實現(xiàn)的 .txt 文件讀寫
可以用 cvSave 和 cvLoad 實現(xiàn),格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的數(shù)據(jù)讀寫,還是用 .xml/.yml 文件格式較好,我比較喜歡 .yml 格式,可讀性非常棒。
用 cvSave 和 cvLoad 讀寫 .txt 文件,其實現(xiàn)方式和數(shù)據(jù)格式與 .yml 文件基本一致。
例如:cvSave("camera_matrix.txt",camera_matrix); //保存了 camera_matrix 的數(shù)組頭以及和它所指的data(類似yml形式的文件)
2、導(dǎo)入/導(dǎo)出其它程序的 .txt 文件數(shù)據(jù)
可以用常規(guī)的 sprintf_s 和 fprintf_s 來實現(xiàn),不過效率比較低,這里介紹一種快捷易用的方法,利用了 std 的 steam 和 vector。
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
using namespace std;
/*----------------------------
* 功能 : 將 cv::Mat 數(shù)據(jù)寫入到 .txt 文件
*----------------------------
* 函數(shù) : WriteData
* 訪問 : public
* 返回 : -1:打開文件失敗;0:寫入數(shù)據(jù)成功;1:矩陣為空
*
* 參數(shù) : fileName [in] 文件名
* 參數(shù) : matData [in] 矩陣數(shù)據(jù)
*/
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);
}
// 寫入數(shù)據(jù)
for (int r = 0; r < matData.rows; r++)
{
for (int c = 0; c < matData.cols; c++)
{
uchar data = matData.at<uchar>(r,c); //讀取數(shù)據(jù),at<type> - type 是矩陣元素的具體數(shù)據(jù)格式
outFile << data << "\t" ; //每列數(shù)據(jù)用 tab 隔開
}
outFile << endl; //換行
}
return (retVal);
}
/*----------------------------
* 功能 : 從 .txt 文件中讀入數(shù)據(jù),保存到 cv::Mat 矩陣
* - 默認(rèn)按 float 格式讀入數(shù)據(jù),
* - 如果沒有指定矩陣的行、列和通道數(shù),則輸出的矩陣是單通道、N 行 1 列的
*----------------------------
* 函數(shù) : LoadData
* 訪問 : public
* 返回 : -1:打開文件失敗;0:按設(shè)定的矩陣參數(shù)讀取數(shù)據(jù)成功;1:按默認(rèn)的矩陣參數(shù)讀取數(shù)據(jù)
*
* 參數(shù) : fileName [in] 文件名
* 參數(shù) : matData [out] 矩陣數(shù)據(jù)
* 參數(shù) : matRows [in] 矩陣行數(shù),默認(rèn)為 0
* 參數(shù) : matCols [in] 矩陣列數(shù),默認(rèn)為 0
* 參數(shù) : matChns [in] 矩陣通道數(shù),默認(rèn)為 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);
}
// 載入數(shù)據(jù)
istream_iterator<float> begin(inFile); //按 float 格式取文件數(shù)據(jù)流的起始指針
istream_iterator<float> end; //取文件流的終止位置
vector<float> inData(begin,end); //將文件數(shù)據(jù)保存至 std::vector 中
cv::Mat tmpMat = cv::Mat(inData); //將數(shù)據(jù)由 std::vector 轉(zhuǎn)換為 cv::Mat
// 輸出到命令行窗口
//copy(vec.begin(),vec.end(),ostream_iterator<double>(cout,"\t"));
// 檢查設(shè)定的矩陣尺寸和通道數(shù)
size_t dataLength = inData.size();
//1.通道數(shù)
if (matChns == 0)
{
matChns = 1;
}
//2.行列數(shù)
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.數(shù)據(jù)總長度
if (dataLength != (matRows * matCols * matChns))
{
cout << "讀入的數(shù)據(jù)長度 不滿足 設(shè)定的矩陣尺寸與通道數(shù)要求,將按默認(rèn)方式輸出矩陣!" << endl;
retVal = 1;
matChns = 1;
matRows = dataLength;
}
// 將文件數(shù)據(jù)保存至輸出矩陣
matData = tmpMat.reshape(matChns, matRows).clone();
return (retVal);
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
VC++中HTControl控件類的CHTSlider控制桿控件類簡介
這篇文章主要介紹了VC++中HTControl控件類的CHTSlider控制桿控件類,需要的朋友可以參考下2014-08-08
C語言實現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法
這篇文章主要介紹了C語言實現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法,涉及C語言進行三角函數(shù)與數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
C++實現(xiàn)學(xué)校運動會管理系統(tǒng)
這篇文章主要為大家詳細介紹了C++實現(xiàn)學(xué)校運動會管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10
OpenCV實戰(zhàn)之基于Hu矩實現(xiàn)輪廓匹配
這篇文章主要介紹了利用C++ OpenCV實現(xiàn)基于Hu矩的輪廓匹配,文中的示例代碼講解詳細,對我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以學(xué)習(xí)一下2022-01-01

