OpenCV cv.Mat与.txt文件数据的读写操作

所属分类: 软件编程 / C 语言 阅读数: 88
收藏 0 赞 0 分享

本篇文章主要介绍了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); 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多