毕雪华 王超
【摘要】文章介绍了Visual C++作为一种面向对象软件开发语言的长处、Matlab引擎(Matlab Engine)的特点及其在图像处理方面的优势,并介绍了一种应用VC++ 调用Matlab引擎本方法实现VC++与Matlab的混合编程,并将该方法应用于数字图像处理中。
【关键词】Visual C++;Matlab引擎;图像处理;混合编程
1.引言
Matlab,具有非常强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算的功能。VC++是当前Windows 下的主要编程语言之一,把Matlab与Visual C++在图像处理的应用中结合起来,将会大大提高编程效率。本文通过在Visual C++中调用Matlab引擎的方法进行图像处理混合编程,这样既方便了调用Matlab工具箱中的图像处理函数,又精简了源程序代码,还保留了Visual C++面向对象及可视化等WINDOWS程序风格和快速处理数据的能力,虽然这种方法并不能脱离Matlab环境独立运行,但是事实证明:在需要Matlab强大工具箱支持的情况下,这种方法是行之有效的最好解决办法。
2.方法
2.1 混合编程简介
Matlab与高级语言接口的方法有很多种,按各种方法要求的环境不同,分为两类:一类为需要Matlab环境支持的调用方法,这种方法要求系统安装Matlab环境,如:调用引擎函数库、使用ActiveX等。另一类是能生成独立可执行程序的方法,这种方法不再需要安装Matlab环境,而只需要拷贝部分Matlab的动态链接库。这类方法如:直接调用数学函数库、使用编译生成的独立可执行代码等。
2.2 Matlab引擎介绍
Matlab engine提供了一组Matlab API函数(Application Program Interface),我们通过一种专门的对象类型———Matlab数组(mxArray)来完成Matlab引擎与Visual C++之间的数据交换。我们不必关心Matlab Engine是如何实现的,只要调用这些API函数即可。
3.系统设计
3.1 Visual C++与Matlab混合编程环境
3.1.1 Matlab环境设置:
Visual C++ 6.0要调用 Matlab Engine,还需要库文件的支持,由于采用的是Matlab6.5,它自带了库文件,如:libeng.lib libmx.lib libmat.lib libmatlb.lib libmatlbmx.lib 等。需要把它们添加到工程当中。但是如果应用Matlab 版本过低 ,则需要将Matlab安装目录下\extern\include下的libeng.def libmx.def libmat.def 等文件生成相應的库文件。
3.1.2 Visual C++ 6.0设置
在VC++中创建单文档、多文档或者是基于对话框的MFC工程。将上述库文件libeng.lib libmx.lib libmat.lib libmatlb.lib libmatlbmx.lib 等添加到工程中:Visual C++工程当中project选项→setting选项→link选项卡→添加到Object/library Modules当中去,特别注意:*.LIB中间只能用空格间断。
设置Visual C++工具条中的select选项:在tools菜单中选择select子菜单,然后再directory标签下添加一个指向c:\matlab6p5\extern\include目录的include file;再添加一个指向c:\matlab6p5\extern\lib\win32\microsoft\msvc60目录的library files
在所建立的工程当中添加engine.h matlab.h,在相应工程的.CPP中添加#include “engine.h” 和 #include “matrix.h”
3.2 程序实现
本程序使用VC++调用Matlab引擎方法实现图像处理:图像滤波、边缘提取、图像反色、图像二值化、图像变色 。利用图像反色举例说明,其他效果实现方法与其类似,只要m文件编写顺利并调试通过,则实现方法相同。
3.2.1 .m文件编写
在matlab中很容易能够编写出图像反色的如下程序:
bor=imread('要显示的图片');
bor=double(bor);
[m n r]=size(bor);
for(k=1:r)
inv(:,:,k)=255-bor(:,:,k)
end
i=uint8(inv);
imshow(i)
3.2.2 VC++工程代码编写
在VC++中创建单文档、多文档或者是基于对话框的MFC工程。根据具体需要,建立工程,加入button控件,设置button控件的属性,这里取名ID_rgb。
通过VC环境从用户处得到的图片的文件名是CString型 但是在Matlab工作区只支持char型的数据,所以将CString型转换为char型
通过本软件图像处理过程可以看出,在Visual C++中调用Matlab引擎简单的几条语句就可以很方便的对给定的图像进行各种各样的处理,如上面所提到的:图像滤波、边缘提取、图像反色、图像二值化、图像变色等,由于篇幅所限,仅列部分图示。由于处理后的图片是用Matlab打开的,Matlab对显示的图片提供了一系列的操作,如图像的保存、放大、缩小、多角度观察,在图片上添加文字等等,而这些要在VC中编程实现,将非常的麻烦。有数据显示,用Matlab与Visual C++ 混合编程代码长度要比单一Visual C++代码长度大大缩短,并且运行时间要比单一Matlab语言编程减少许多,运行效率也有很大的提高。虽然引擎方法离不开Matlab环境,但是还是能够提供较大的便利。
4.结论
综上所述,利用Matlab engine简单有效的实现在VC++中调用Matlab的功能,从而实现了图像的处理。通过这个设计发现用引擎方法实现VC++和Matlab混合编程用于图像处理有非常大的优势,这表明对于一个涉及到图像处理和操作并在Windows环境中运行的一个应用软件的开发,采用VC++和Matlab协同工作的方法可以大大提高软件的开发效率,有利于充分发挥两种软件的自身所具有的独特的优势,取得很好的效果。
参考文献
[1]马兴义.Matlab 应用开发指南[M].北京:机械工业出版社,2001(11).
[2]杨丽娜.浅析VC++与Matlab混合编程方法在图像处理中的应用[J].大众科技,2006,88(2):73:74.
[3]刘志俭.Matlab应用程序接口用户指南[M].北京科学出版社,2000.
[4]陶红,袁金荣.Matlab与C/VisualC++混合编程的实现[J].计算机工程与应用,2000
基金项目:新疆医科大学科研创新基金(编号:XJC201317)。
作者简介:毕雪华(1982—),硕士,副教授,研究方向:计算机应用。