2015-05-10 2 views
3

Я хотел бы преобразовать свой OpenCV Mat в файл Matlab .mat, который легко читается Matlab. Я не хочу использовать функцию Mex, чтобы напрямую предоставлять данные в matlab, так как я хочу сохранить данные на жестком диске.OpenCV Mat -> Matlab Mat File

Доступна функция cvmatio cpp: cvmatio, но, как я уже видел, есть только функция для чтения Matlab Mat с OpenCV, но нет функции для создания Matlab Mat из openCV.

Другая возможность состоит в том, чтобы сохранить его в CSV-файл и читать далее через MATLAB, как упомянуто здесь: OpenCV -> CSV

Есть ли другие библиотеки или функция доступна, которая преобразует данные непосредственно в коврике Matlab?

ответ

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