MATLAB具有丰富的图像处理函数库,运算速度慢,特别是在多重循环的情况下,不适合直接应用于工程当中。如果能把MATLAB和另一种适合工程的编程语言结合到一起运用到数字图像处理领域,则会更加方便的进行图像处理,MATLAB和C/C++的混合编程,既继承了MATLAB的优点,又拥有了C/C++运算速度快、适合工程应用的特点。
一、MATLAB引擎与运行环境配置
1.MATLAB引擎
MATLAB引擎包含了所需要的运行库,允许C/C++来调用MATLAB内部的函数进行编程。MATLAB引擎是一种独立的C/C++程序,可以通过相应的接口在Windows系统上使用,是在一个单独的进程中运行的,不会拖慢主进程的运行速度。MATLAB引擎提供了一系列函数,允许用户在程序里启动或者结束调用MATLAB的进程,给MATLAB进程发送指令以及给MATLAB发送数据或者从MATLAB中得到数据。
通过MATLAB引擎,用户可以在C/C++程序中调用MATLAB内的数学处理函数,比如傅里叶变换函数,也可以通过plot函数进行绘图。
2.MATLAB引擎的重要函数
在C/C++程序中使用MATLAB函数,首先要包含MATLAB引擎头文件engine.h, 只有这样,C/C++程序才能正确的识别MATLAB引擎函数。
(1)引擎的打开和关闭
Engine *engOpen(const char *startcmd);
参数 startcmd 是用来启动 Matlab 引擎的字符串参数,在 Windows 操作系统中只能为 NULL ,函数返回值是一个 Engine 类型的指针,它是在 engine.h 中定义的 engine 数据结构。
int engClose(Engine *ep);
参数 ep 代表要被关闭的引擎指针,函数返回值为 0 表示关闭成功,返回 1 表示发生错误。
例如,通常用来打开 / 关闭 Matlab 引擎的代码如下:
Engine *ep; // 定义 Matlab 引擎指针。 if (!(ep=engOpen(NULL))) // 测试是否启动 Matlab 引擎成功。 { MessageBox("Can't start Matlab engine!" ); exit(1); } ………… engClose(ep); // 关闭 Matlab 引擎。
engEvalString -发送命令让 Matlab 执行;
int engEvalString(Engine *ep, Const char *string);参数 ep 为函数 engOpen 返回的引擎指针,字符串 string 为要 matlab 执行的命令, 函数返回值为 0 表示成功执行,返回 1 说明执行失败(如命令不能被 Matlab 正确解释或 Matlab 引擎已经关闭了)。
(3)读写 Matlab 数据
从 Matlab 引擎工作空间中获取变量;
mxArray *engGetVariable(Engine *ep, const char *name);参数 ep 为打开的 Matlab 引擎指针, mp 为指向被写入变量的指针, name 为变量写入后在 Matlab 引擎工作空间中的变量名,函数返回值为 0 表示写入变量成功,返回值为 1 表示发生错误。
(4)创建和清除 mxArray 型数据
Matlab 有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是 mxArray ,数组的建立采用mxCreatexxx 形式的函数,例如新建一个double 类型数组,可用函数mxCreateDoubleMatrix ,函数形式如下:
mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);参数 m 和 n 为矩阵的函数和列数。 ComplexFlag 为常数,用来区分矩阵中元素是实数还是复数,取值分别为 mxREAL 和 mxCOMPLEX 。
例如,创建一个 3 行 5 列的二维实数数组,可用如下语句:
mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);对应的,要删除一个数组mxDestroyArray ,该函数声明如下:
void mxDestroyArray(mxArray *array_ptr);参数 array_ptr 为要删除的数组指针;
要删除上面创建的数组 T ,可用如下语句:
mxDestroyArray(T);创建一个字符串类型并初始化为 str 字符串:
mxArray *mxCreateString(const char *str);