将数据从OpenCV矩阵发送到Matlab Engine,C++

7
我正在使用C++和Matlab引擎将数据从OpenCV矩阵发送到Matlab。我尝试将列主序转换为行主序,但是我真的很困惑如何做到这一点。我无法理解如何处理Matlab指针mxArray并将数据放入引擎中。
有人曾经使用OpenCV与Matlab一起发送矩阵吗?我没有找到太多信息,我认为这是一个非常有趣的工具。欢迎任何帮助。

值得一试的是mexopencv,这个项目将OpenCV作为MEX函数暴露给MATLAB。 - Amro
1个回答

7
我有一个函数,如果您已经创建了Matlab引擎,它将起作用。我的做法是为Matlab引擎创建一个SingleTone模板:
我的头文件看起来像这样:
/** 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);
    };

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

当你想要发送一个矩阵时,例如。
Mat A = Mat::zeros(13, 1, CV_32FC1);

这就是这么简单:
MatlabWrapper::getInstance()->cvLoadMatrixToMatlab(A,"A");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接