由于平时需要经常用到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
1. opencv读写txt文本**
1.1 opencv读txt文本数据到Mat矩阵中。
下面是实现该功能的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);
1.2 opencv保存Mat矩阵到txt文本中
下面是实现该功能的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);
2 matlab 读写txt文本
2.1 matlab读txt文本保存到相应变量中
实现该功能的matab命令如下
load -ascii filename
读取”data.txt"文本的命令如下,并将读取的数据保存在data变量中
load -ascii ‘data.txt’
使用textread函数 也是可以的
filename = ‘data.txt’;
[data1,data2, …]=textread(filename,’%n%n…’); %根据列数来自定义
2.2 matlab写txt文本
matlab写txt文本命令如下
dlmwrite('filename', M, 'D')
M是需要保存的变量, D是隔开数据的符号,可以是空格、逗号等。这里使用空格便于利用C++对txt文件进行处理。
例如保存mat变量到"data.txt" 文件中,并以空格隔开数据,其命令如下
dlmwrite('data.txt', mat, ' ')