OpenCV Mat - > Matlab Mat文件

时间:2015-05-10 19:11:48

标签: c++ matlab opencv data-conversion mat

我想将我的OpenCV Mat转换为Matlab .mat文件,Matlab可以轻松读取。我不想使用Mex函数直接向matlab提供数据,因为我想将数据保存在硬盘上。

有cvmatio cpp函数可用:cvmatio,但正如我所见,只有一个函数可以用OpenCV读取matlab Mat,但没有函数用openCV创建matlab Mat。

另一种可能性是将其存储为csv文件并通过matlab读取,如下所述:OpenCV -> CSV

是否有其他可用的库或函数,可以将数据直接转换为Matlab mat?

2 个答案:

答案 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();
}

Source for write CSV

在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 );
}