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");
Jav_rock
source share