OpenCV cv.Mat與.txt文件數(shù)據(jù)的讀寫操作
本篇文章主要介紹了OpenCV cv.Mat 與 .txt 文件數(shù)據(jù)的讀寫操作,小編覺得挺不錯的,現(xiàn)在分享給大家。
1、按OpenCV格式實(shí)現(xiàn)的 .txt 文件讀寫
可以用 cvSave 和 cvLoad 實(shí)現(xiàn),格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的數(shù)據(jù)讀寫,還是用 .xml/.yml 文件格式較好,我比較喜歡 .yml 格式,可讀性非常棒。
用 cvSave 和 cvLoad 讀寫 .txt 文件,其實(shí)現(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 來實(shí)現(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í)有所幫助,也希望大家多多支持我們。
上一篇:C語言二叉樹常見操作詳解【前序,中序,后序,層次遍歷及非遞歸查找,統(tǒng)計個數(shù),比較,求深度】
欄 目:C語言
下一篇:c語言 sscanf,scanf,fscanf正則表達(dá)式用法
本文標(biāo)題:OpenCV cv.Mat與.txt文件數(shù)據(jù)的讀寫操作
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/818.html
您可能感興趣的文章
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10深入理解atoi()與itoa()函數(shù)的用法
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解
- 01-10Linux線程管理必備:解析互斥量與條件變量的詳解
- 01-10深入理解大數(shù)與高精度數(shù)的處理問題
- 01-10深入理解數(shù)組指針與指針數(shù)組的區(qū)別
- 01-10C語言游戲必備:光標(biāo)定位與顏色設(shè)置的實(shí)現(xiàn)方法
- 01-10深入探討C語言中局部變量與全局變量在內(nèi)存中的存放位置
- 01-10linux c 查找使用庫的cflags與libs的方法詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置