Sending data from OpenCV matrix to Matlab Engine, C ++

I am sending data from OpenCV matrices to matlab using C ++ and Matlab Engine. I tried converting from the main column to a row of rows, but I really got confused about how to do this. I cannot figure out how to handle the Matlab mxArray pointer and put the data in the engine.

Has anyone worked with OpenCV along with matlab to send matrices? I did not find much information, and I think this is a really interesting tool. Any help would be appreciated.

+7
source share
1 answer

I have a function that works if you created a matlab mechanism. I am creating a SingleTone template for the Matlab mechanism:

My title is as follows:

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

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

If you want to send a matrix, for example

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

It is as simple as this:

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

All Articles