cv.Mat 与 .txt 文件数据的读写操作
来源:互联网 发布:核函数 知乎 编辑:程序博客网 时间:2024/05/16 18:57
来源:http://blog.csdn.net/chenyusiyuan/article/details/7974378#comments
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);
- }
- cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记(23)cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- C#与TXT文件的读写操作
- cv::mat的基本操作
- cv::mat的基本操作 ***** **
- cv::Mat 的数据拷贝
- 【OpenCV3】cv::Mat中的数据按行列写入txt文件中
- C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件
- C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件类型
- mat文件与txt文件的相互转换(特别的,mat转txt,数据格式设置)
- mat文件与txt文件的相互转换(特别的,mat转txt,数据格式设置)
- MATLAB的.mat文件与txt文件的相互转换(mat转txt,数据格式设置)
- txt文件的创建与读写
- 读《Master OpenCV》初感
- linux screen命令
- 图的深度与广度遍历比较
- 字符数据的输入/输出
- mysql更改表结构:添加、删除、修改字段、调整字段顺序
- cv.Mat 与 .txt 文件数据的读写操作
- Linux IO资源监控
- 建小顶堆和大顶堆排序算法(数据结构经典)
- windows驱动开发笔记
- QTime类介绍
- 第一章、Linux是什么
- C++运算符重载(成员函数以及友元函数实现)
- VC/MFC 使用GDI实现抓屏
- Linux cpu信息查看