2012-06-04 14 views
7

Estoy enviando datos de matrices OpenCV a Matlab usando C++ y Matlab Engine. Traté de convertir de la columna principal a la fila principal, pero estoy muy confundido sobre cómo hacerlo. No puedo entender cómo lidiar con el puntero de Matlab mxArray y poner datos en el motor.Enviando datos de la matriz OpenCV a Matlab Engine, C++

¿Alguien ha trabajado con OpenCV junto con matlab para enviar matrices? No encontré mucha información y creo que es una herramienta realmente interesante. Cualquier ayuda será bienvenida.

+0

merece la pena echarle un vistazo [mexopencv] (https://github.com/kyamagu/mexopencv), un proyecto que expone OpenCV a MATLAB como funciones MEX – Amro

Respuesta

7

Tengo una función que funciona si ha creado el motor matlab. Lo que hago es crear una plantilla Singletone para el motor MATLAB:

Mi cabecera es así:

/** Singletone class definition 
    * 
    */ 
class MatlabWrapper 
    { 
    private: 
     static MatlabWrapper *_theInstance; ///< Private instance of the class 
     MatlabWrapper(){}   ///< Private Constructor 
     static Engine *eng; 

    public: 
     static MatlabWrapper *getInstance() ///< Get Instance public method 
     { 
      if(!_theInstance) _theInstance = new MatlabWrapper(); ///< If instance=NULL, create it 

    return _theInstance;   ///< If instance exists, return instance 
     } 
    public: 
    static void openEngine();    ///< Starts matlab engine. 
    static void cvLoadMatrixToMatlab(const Mat& m, string name); 
    }; 

Mi CPP:

#include <iostream> 
using namespace std; 

MatlabWrapper *MatlabWrapper::_theInstance = NULL;    ///< Initialize instance as NULL  
Engine *MatlabWrapper::eng=NULL; 
void MatlabWrapper::openEngine() 
{ 
     if (!(eng = engOpen(NULL))) 
     { 
      cerr << "Can't start MATLAB engine" << endl; 
      exit(-1); 
     }  
} 
void MatlabWrapper::cvLoadMatrixToMatlab(const Mat& m, const string name) 
{ 
    int rows=m.rows; 
    int cols=m.cols;  
    string text; 
    mxArray *T=mxCreateDoubleMatrix(cols, rows, mxREAL); 

    memcpy((char*)mxGetPr(T), (char*)m.data, rows*cols*sizeof(double)); 
    engPutVariable(eng, name.c_str(), T); 
    text = name + "=" + name + "'";     // Column major to row major 
    engEvalString(eng, text.c_str()); 
    mxDestroyArray(T); 
} 

Cuando se desea enviar una matriz, por ejemplo,

Mat A = Mat::zeros(13, 1, CV_32FC1); 

Es tan simple como esto:

MatlabWrapper::getInstance()->cvLoadMatrixToMatlab(A,"A");