由于平时需要经常用到opencv和matlab处理数据,所以,实现两者之间数据传递,是很有意义的。 本文记录了opencv读写txt文本、matlab读写txt文本的方法。并借助txt文本这个中间媒介实现两个软件的数据交互功能。下面以此介绍opencv、matlab读写txt文本的方法。
本文介绍的方法均是搜集于互联网。opencv对txt文本的读写方法,依据以下网址改进而得
http://blog.csdn.net/chenyusiyuan/article/details/7974378
matlab对txt文本的读写方法依据以下网址改进而得
http://blog.csdn.net/fengfuhui/article/details/7651840
下面是实现该功能的C++代码,在源代码的基础上,本文将其改编为模板函数,这样可以应对多种数据类型。
template <typename dtype> int loadData(string fileName, Mat& matData, int matChns, int matRows, int matCols) { int retVal = 0; // 打开文件 ifstream inFile(fileName.c_str(), ios_base::in); if(!inFile.is_open()) { cout << "读取文件失败" << endl; retVal = -1; return (retVal); } // 载入数据 istream_iterator<dtype> begin(inFile); //按 float 格式取文件数据流的起始指针 istream_iterator<dtype> end; //取文件流的终止位置 vector<dtype> inData(begin,end); //将文件数据保存至 std::vector 中 Mat tmpMat = 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); }例如读取通道为1,行列均为10的数据,并保存到矩阵mat中,该数据以ASCII码的保存在"data.txt"文本文件中。函数调用方式如下:
loadData<float>("data.txt", mat, 1, 10, 10);下面是实现该功能的C++代码,同样以模板函数的方式实现。
template <typename dtype> int writeData(string fileName, 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++) { dtype data = matData.at<dtype>(r,c); //读取数据,at<type> - type 是矩阵元素的具体数据格式 outFile << data << "\t" ; //每列数据用 tab 隔开 } outFile << endl; //换行 } return (retVal); }例如保存mat矩阵到“data.txt" 文本函数调用如下
writeData("data.txt", mat);实现该功能的matab命令如下
load -ascii filename读取”data.txt"文本的命令如下,并将读取的数据保存在data变量中
load -ascii ‘data.txt’使用textread函数 也是可以的 filename = ‘data.txt’; [data1,data2, …]=textread(filename,’%n%n…’); %根据列数来自定义
matlab写txt文本命令如下
dlmwrite('filename', M, 'D')M是需要保存的变量, D是隔开数据的符号,可以是空格、逗号等。这里使用空格便于利用C++对txt文件进行处理。 例如保存mat变量到"data.txt" 文件中,并以空格隔开数据,其命令如下
dlmwrite('data.txt', mat, ' ')