您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/10/17 2:35:18发布34次查看
这篇文章主要介绍了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); }
相关推荐:
python3.4.3下逐行读入txt文本并去重的方法
以上就是opencv cv.mat与.txt文件数据的读写操作的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product