- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望能够将任何 OpenCV 变量发送到 Matlab,以便以舒适的方式绘制图表和计算统计数据。
我知道我必须使用 Matlab 引擎,但是网上几乎没有关于如何从代码的任何部分访问它的帮助,或者关于从 CV::Mat 转换为 Matlab 数组的函数,或者如何在这种特定情况下处理列优先和行优先。
我认为从 OpenCV 到 Matlab 的分步过程会非常有趣,因为 OpenCV 正变得非常流行,而且 Matlab 对调试有很大帮助。
最佳答案
逐步将数据从 OpenCV 发送到 Matlab
1.- 包含和链接库
使用 Matlab Engine 的必要 header 是"engine.h" 和"mex.h"。包含路径将是这样的:
c:\Program Files (x86\MATLAB\R2010a\extern\include)
在附加依赖项中,您应该添加:libeng.lib、libmex.lib 和 libmx.lib。
设置项目的最简单方法是使用 CMake,因为您只需要编写这些行
find_package( Matlab REQUIRED )
INCLUDE_DIRECTORIES( ${MATLAB_INCLUDE_DIR})
CMake 将为您设置路径并链接所需的库。通过使用环境变量,您可以使项目与用户无关。这就是我一直使用 CMake 的原因。
2.- Matlab 引擎独特实例的单例模板。
从代码的任何部分调用 Matlab 引擎的一种真正舒适的方法是创建单例模板。例如,您可以创建一个 “matlabSingleton.h”,然后编写如下内容。
#include "engine.h";
#include "mex.h";
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 NULL, create it
return _theInstance;
}
public:
static void openEngine();
void initializeVariable(const string vName) const;
// ... other functions ...
};
然后在"matlabSingleton.cpp"你应该写
#include "matlabSingleton.h"
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::initializeVariable(const string vName) const
{
string command = vName + "=0";
engEvalString(eng, command.c_str());
}
3.- 在您的主代码中使用 Matlab 引擎。
有很多方法可以做到这一点,但我通常会定义一个函数 initializeMatlab()
,我会在其中初始化我稍后将使用的变量(Matlab 变量)。您不需要创建 MatlabWrapper 类,因为在您第一次调用 getInstance() 时它会被创建。下次您调用 getInstance 时,它将被返回。这就是单调的用途。
void initializeMatlab(){
MatlabWrapper::getInstance()->initializeVariable("whatever1"); //class is created
MatlabWrapper::getInstance()->initializeVariable("whatever2"); //instance of the class returned
}
4.- 将 OpenCV 矩阵发送到 Matlab
这是我遇到更多困难的地方。这是一个简单的功能,只是将一个矩阵发送到matlab 进行逐步调试。每次都会被覆盖。
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);
double *buffer=(double*)mxGetPr(T);
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
buffer[i*(cols)+j]= (double)m.at<float>(i,j);
}
}
engPutVariable(eng, name.c_str(), T);
text = name + "=" + name + "'"; // Column major to row major
engEvalString(eng, text.c_str());
mxDestroyArray(T);
}
关于c++ - 轻松将 OpenCV C++ 变量发送到 Matlab 的分步指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987660/
似乎有很多不同的自动化构建/部署方法,以至于很难解析人们在网络教程中支持的所有不同场景。所以我想向stackoverflow人群提出这个问题......使用以下配置设置自动构建和部署系统的最佳方法是什
我是一名优秀的程序员,十分优秀!