栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本篇文章主要介绍了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  
#include  
#include  
#include  
 
using namespace std; 
 
 
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(r,c); //读取数据,at - type 是矩阵元素的具体数据格式 
 outFile << data << "t" ; //每列数据用 tab 隔开 
 } 
 outFile << endl; //换行 
 } 
 
 return (retVal); 
} 
 
  
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 begin(inFile); //按 float 格式取文件数据流的起始指针 
 istream_iterator end; //取文件流的终止位置 
 vector inData(begin,end); //将文件数据保存至 std::vector 中 
 cv::Mat tmpMat = cv::Mat(inData); //将数据由 std::vector 转换为 cv::Mat 
 
 // 输出到命令行窗口 
 //copy(vec.begin(),vec.end(),ostream_iterator(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); 
} 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/62918.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号