Matlab是当前应用最为广泛的数学软件,可快速实现十分复杂的功能,减少开发时间,极大地提高工程分析计算的效率,但与其他高级程序(C、C++)相比,Matlab程序是一种解释执行程序,某些情况程序执行速性能不如C、C++。
C/C++语言是目前最为流行的高级程序设计语言之一。它可对操作系统和应用程序以及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,但是相对于MATLAB编程难度较高,且MATLAB具有强大的数值计算等能力,可大大提升开发效率。
因此存在一种方案,就是采用混合编程,对于C++开发人员可使用Matlab的优势实现数学计算等C++开发效率较低的模块(比如服务器开发过程中的一些图像处理算法算法)来提高开发效率

C++调用MATLAB混合编程流程如下

                                                                        C++ MATLAB 混合编程

  1. 环境部署

打开并运行Matlab软件,在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010,具体操作下图所示:

2.  编写.m文件

如下函数时完成图像的二值化功能:

 

  1. function imagedata=improcess(filename,threshold);  
  2. imagedata=double(imread(filename));  
  3. newbuf=imagedata;  
  4. [M N]=size(imagedata);  
  5. for i=1:1:M  
  6.   for j=1:1:N  
  7.       if imagedata(i,j)>threshold  
  8.           newbuf(i,j)=255;  
  9.       else  
  10.           newbuf(i,j)=0;  
  11.       end  
  12.   end  
  13. end  
  14. return;  
  1. MATLAB打包CC++

在窗口输入deploytool,会出现如下的框图,项目名称,存储位置和转化的类型选择C++,选择好之后,点击OK

C++ MATLAB 混合编程

这时你会发现出现了一个C++ Shared Library的窗口,添加MATLABm文件 ,添加好之后,点击build,耐心等待一会,完成之后生成有srcdistrib两个文件夹,打开src文件里面的内容如下所示:

C++ MATLAB 混合编程

srccpp文件就是C++的格式文件,还有dll文件,你可以在VS中建立一个C++项目。里面添加生成的dll文件,就可以使用matlab定义的这个函数啦,这就是将MATLABC++结合了起来。

  1. C++调用

matlab编译生成的MatImprocess.h MatImprocess.lib MatImprocess.dll文件拷贝到工程目录下,并将头文件和静态链接库添加到工程中,C++调用MATLAB函数需要经过mwArray中间变量,调用流程如下图所示:

                                                                            C++ MATLAB 混合编程

  调用函数实例如下:

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的强大计算能力来提高程序开发效率,大大节省开发时间

相关文章: