Matlab是当前应用最为广泛的数学软件,可快速实现十分复杂的功能,减少开发时间,极大地提高工程分析计算的效率,但与其他高级程序(C、C++)相比,Matlab程序是一种解释执行程序,某些情况程序执行速性能不如C、C++。
C/C++语言是目前最为流行的高级程序设计语言之一。它可对操作系统和应用程序以及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,但是相对于MATLAB编程难度较高,且MATLAB具有强大的数值计算等能力,可大大提升开发效率。
因此存在一种方案,就是采用混合编程,对于C++开发人员可使用Matlab的优势实现数学计算等C++开发效率较低的模块(比如服务器开发过程中的一些图像处理算法算法)来提高开发效率
C++调用MATLAB混合编程流程如下
- 环境部署
打开并运行Matlab软件,在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010,具体操作下图所示:
2. 编写.m文件
如下函数时完成图像的二值化功能:
- function imagedata=improcess(filename,threshold);
- imagedata=double(imread(filename));
- newbuf=imagedata;
- [M N]=size(imagedata);
- for i=1:1:M
- for j=1:1:N
- if imagedata(i,j)>threshold
- newbuf(i,j)=255;
- else
- newbuf(i,j)=0;
- end
- end
- end
- return;
- MATLAB打包C、C++库
在窗口输入deploytool,会出现如下的框图,项目名称,存储位置和转化的类型选择C++,选择好之后,点击OK
这时你会发现出现了一个C++ Shared Library的窗口,添加MATLAB的m文件 ,添加好之后,点击build,耐心等待一会,完成之后生成有src和distrib两个文件夹,打开src文件里面的内容如下所示:
src的cpp文件就是C++的格式文件,还有dll文件,你可以在VS中建立一个C++项目。里面添加生成的dll文件,就可以使用matlab定义的这个函数啦,这就是将MATLAB和C++结合了起来。
- C++调用
将matlab编译生成的MatImprocess.h MatImprocess.lib MatImprocess.dll文件拷贝到工程目录下,并将头文件和静态链接库添加到工程中,C++调用MATLAB函数需要经过mwArray中间变量,调用流程如下图所示:
调用函数实例如下:
int main(int argc, char* argv[])
{
//初始化
if( !MatImprocessInitialize())
{
printf("Could not initialize !");
return -1;
}
mwArray stFileNameame(1,9, mxCHAR_CLASS);
char cName[10]="test.jpg";
stFileNameame.SetData(cName,9);
// 阈值
mwArray stThreshold(1,1, mxDOUBLE_CLASS);
stThreshold(1,1)=128;//阈值为128
// 返回数据
mwArray stImageData(512,512, mxDOUBLE_CLASS);
// 函数调用
improcess(1,stImageData,stFileNameame,stThreshold); //1,表示返回值的个数,ImageData用于接收返回值
printf("\n图像二值化结束\n");
// 获取数据
double* pResultdata = new double[512*512];
stImageData.GetData(pResultdata,512*512);
printf("\n已获得图像数据...\n");
for(int i = 0;i < 512;i++)
{
for(int j = 0;j < 512;j++)
{
printf("%0.1f ",pResultdata[512*i+j]);
}
printf("\n");
}
delete []pResultdata;
pResultdata = NULL;
// 后面是一些终止调用的程序
MatImprocessTerminate();
mclTerminateApplication();
return 0;
}
通过上述方案,C++开发人员利用MATLAB的强大计算能力来提高程序开发效率,大大节省开发时间