我想将我的OpenCV Mat转换为Matlab .mat文件,Matlab可以轻松读取。我不想使用Mex函数直接向matlab提供数据,因为我想将数据保存在硬盘上。
有cvmatio cpp函数可用:cvmatio,但正如我所见,只有一个函数可以用OpenCV读取matlab Mat,但没有函数用openCV创建matlab Mat。
另一种可能性是将其存储为csv文件并通过matlab读取,如下所述:OpenCV -> CSV
是否有其他可用的库或函数,可以将数据直接转换为Matlab mat?
答案 0 :(得分:3)
我发现这是问题的最佳答案,因为在没有使用临时文件的情况下我没有找到直接的方法。
将OpenCV Mat写入CSV文件:
#include <fstream>
void MeasureTool::writeCSV(string filename, cv::Mat m)
{
cv::Formatter const * c_formatter(cv::Formatter::get("CSV"));
ofstream myfile;
myfile.open(filename.c_str());
c_formatter->write(myfile, m);
myfile.close();
}
在Matlab中使用以下函数来读取csv文件:
x1 = csvread('yourFile.csv',0,0);
答案 1 :(得分:0)
我不久前为一个项目编写了以下C代码。它有点过时,但它与matlab 2011a一起工作。它应该作为一个例子,如果没有别的。它确实做了许多假设 - 主要是记录在案。
输入参数是要写入的文件名,指向CvMat的指针数组,这些矩阵的名称数组以及要写入的矩阵数。
void writeMatFile( const char *fileName, CvMat ** matrices, const char **names, int numMatrices ) {
FILE *file = fopen( fileName, "wb" );
for( int i=0; i<numMatrices; i++ ) {
CvMat * mat = matrices[i];
const char *name = names[i];
// If mat is ND we write multiple copies with _n suffixes
int depth = CV_MAT_CN(mat->type);
for( int d=0; d<depth; d++ ) {
// Assumption that we are always dealing with double precision
uint32_t MOPT = 0000;
fwrite(&MOPT, 1, sizeof( uint32_t), file);
uint32_t mrows = mat->rows;
uint32_t ncols = mat->cols;
uint32_t imagef = 0;
char nameBuff[ strlen( name ) + 10];
strcpy(nameBuff, name);
if( depth>1) {
char suffix[5];
sprintf(suffix, "_L%d", d+1);
strcat(nameBuff, suffix);
}
uint32_t nameLength = strlen( nameBuff ) + 1;
fwrite( &mrows, 1, sizeof( uint32_t), file);
fwrite( &ncols, 1, sizeof( uint32_t), file);
fwrite( &imagef, 1, sizeof( uint32_t), file);
fwrite( &nameLength, 1, sizeof( uint32_t), file);
fwrite( nameBuff, nameLength, 1, file );
for( int col = 0; col<ncols; col++ ) {
for( int row=0; row<mrows; row++ ) {
CvScalar sc = cvGet2D(mat, row, col);
fwrite(&(sc.val[d]), 1, sizeof( double ), file);
}
}
}
}
fclose( file );
}