据我的工程经验,做图像处理过程中经常用到matlab和c++(opencv, opengl etc).下面给大家分享一段我的工作笔记:
//Data interaction between C++ and matlab:
//1.read binary data file generated by cpp project via matlab:
main()
{
fstream data_out;
data_out.open("data_cpp2mat.txt", ios::out | ios::binary);
int Arr[100];
for(int i=0; i<100; i++)
{
Arr = i;
}
writeArr<int>(Arr, 100, &data_out);
data_out.close();
}
template <class Type>
void writeArr(Type *Arr, const int ArrLen, fstream *data_out_file)
//Effect: write data "Arr" to file "data_out_file" in binary type so that can be readed via matlab
//Author: Su Dongcai at 2011/10/29
{
data_out_file->write(reinterpret_cast<char *>(Arr), ArrLen * sizeof(Type));
}
//The matlab m-file for reading:
function a = readCppData(fileName, size, precision)
%Effect: read matrix 'a' in file('fileName') which generated by cpp project
%Inputs:
%fileName: the absolute name of file where data stored
%size: the size of Array
%precision: the type of the Array
%Author: Su Dongcai at 2011/10/29
fid = fopen(fileName, 'r');
a = fread(fid, size, precision);
//2.read binary data file generated by matlab via cpp project:
//matlab writing function:
function saveBinaryFile(fileName, Arr)
%Effect: save data(double) Arr into 'fileName' which is a binary type data file
fid = fopen(fileName, 'w');
Arr = [length(Arr), Arr];
fwrite(fid, Arr, 'double');
cpp reading function:
main()
{
fstream data_in;
data_in.open("matlab2cpp.txt", ios::in | ios::binary);
double *pArr;
int ArrLen;
readArr<double>(&data_in, &pArr, &ArrLen);
for(int i=0; i<100; i++)
{
cout<<pArr<<", ";
}
data_in.close();
delete [] pArr;
return 0;
}
template <class Type>
void readArr(fstream *data_in_file, Type **ppArr, int *pArrlen)
//Effect: read objective array 'Arr' from 'data_in_file' which generated by matlab project
//the data structure of 'data_in_file': [ArrLen, {elements of Arr}]
//Author: Su Dongcai at 2011/10/29
{
Type Arrlen;
data_in_file->read(reinterpret_cast<char *>(&Arrlen), sizeof(Type));
int nElements = (int)Arrlen+1;
(*pArrlen) = nElements;
(*ppArr) = new Type[nElements];
data_in_file->read(reinterpret_cast<char *>(*ppArr), nElements*sizeof(Type));
}