开篇:润墨网以专业的文秘视角,为您筛选了一篇Matlab与VC++混合编程技术在图像处理中的应用研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:在简介matlab与vc++混合编程常用技术的基础上,重点阐述了基于Matcom Add-in进行混合编程的主要步骤及其在应用中需要注意的问题。结合实际工程需要将混合编程技术应用于弱小目标图像处理中,该方法可以提高软件开发编程效率,缩短软件开发周期。
关键词:Matlab;VC++;混合编程;图像处理
中图分类号:TP391文献标识码:A文章编号:1009-3044(2011)22-5450-03
Application Research of Matlab and VC++ Mixed Programming in Image Processing
LI Zhuo, LI Yi-min
(College of Computer and Technology, Beihua University, Jilin 132021, China)
Abstract: Based on the introduction of Matlab and VC++ mixed programming technology which is commonly used, the main steps and attention in the application of mixed programming by Matcom Add-in are focused on. Combined with practical engineering needs, mixed programming techniques are used in small target image processing, and it can improve the efficiency of software development and reduce software development cycle.
Key words: Matlab; VC++; mixed programming; image processing
Matlab以其强大的科学计算和绘图功能,在许多科学领域中成为算法研究和应用开发的基本工具。虽然Matlab是一个完全独立的编程和数据运算集成环境,但也存在某些缺点,如:Matlab是一种解释性语言,运行效率却比C++语言低下;Matlab程序不能脱离其环境运行;与通用的编程平台相比在图形用户界面的设计上还不够灵活。Matlab存在的以上缺点限制了它作为通用的软件开发平台。目前,在Windows平台下的图像处理系统开发中,VC++是主要的开发工具,尽管其功能强大和灵活,但编程效率较低,尤其是当需要快算验证算法时。因此,实现Matlab和VC++的混合编程,有助于发挥VC++和Matlab各自的优势,降低开发难度,缩短编程时间,提高软件开发效率。
本文在阐述Matlab与VC++常用的混合编程技术的基础上,重点介绍Matcom Add-in实现混合编程的具体方法及其在图像处理方面的应用。
1 Matlab与VC++常用的混合编程技术简介
1.1 通过使用Matlab引擎方式
Matlab 的引擎库提供一些接口函数,利用这些接口函数,用户可以在自己的程序中以计算引擎方式调用Matlab[1]。这样,将Matlab作为一个计算引擎,在后台运行,VC++语言程序作为客户机在前端运行。Matlab引擎函数库在用户程序与Matlab进程之间架起桥梁,用户程序正是利用这些引擎函数库来实现和MATLAB之间的信息传递。
采用Matlab引擎方式,能利用Matlab全部功能,但是其不足之处在于需要Matlab运行于后台,即没有脱离Matlab的环境,从而导致代码执行效率低下,因此在实际软件开发中一般不采用这种方法。
1.2 通过Matlab自带的编译器
通过Matlab自带的编译器,可以将M程序文件转换成C/C++代码文件,并生成必要的DLL,将其添加到VC++工程中一起编译,生成可独立执行的应用程序。
采用这种方法仍然存在着一些限制,例如:转换后的C++代码可读性不强,代码冗余度较高[2];对于Matlab本身提供的图形界面程序,一般来说,都无法通过Matlab自带的编译器转换成C/C++代码。
1.3 通过使用Matcom工具
Matcom是Mathtools公司推出的世界上第一个由Matlab到C++的编译开发软件平台。通过必要的设置,可以直接实现与VC++的混合编程,它可将Matlab的M文件转化成同等功能的C++源代码,从而使应用程序脱离Matlab环境独立执行。这样,既保持了Matlab的优良算法,又保持了C++的高执行效率。正是这一优点,使其成为Matlab与VC++混合编程技术中常用的也是最有效的方式。
通过使用Matcom工具实现Matlab与VC++混合编程有两种方式[3]:
1) 调用MatrixC++的矩阵数学库;
2) 利用Matcom Add-in技术来调用Matlab工具箱函数和自己编写的M函数,实现Matlab与VC++的混合编程。
与方式(1)相比Matcom Add-in提供了一个Matlab和VC++集成开发环境直接集成的途径,大大简化M文件在VC++环境下的使用,它可以自动集成M文件到Visual C++的工程中。
当然,采用Matcom Add-in实现Matlab与VC++混合编程也有一些不足,例如:对struct类的支持有缺陷;部分绘图语句无法实现,尤其是三维图像[4]。因此在实际应用中,在不涉及到三维做图以及m文件不大的情况下,使用Matcom Add-in实现Matlab和VC++的混合编程是一种行之有效的方式。
2 Matcom Add-in 实现混合编程的方法
2.1 Matcom Add-in的使用步骤
使用Matcom Add-in实现Matlab与VC++混合编程的主要步骤如下:
1) 安装Matcom4.5。
安装Matcom4.5和安装其他Windows应用程序的过程非常相似。只不过,在安装完Matcom4.5后,我们需要启动Matlab软件进行一些配置工作。在Matlab命令行中输入以下命令:
>>mex Csetup
接下来,用户可以根据出现的提示信息,完成将VC++配置成独立应用程序和MEX所使用的默认编译器,并安装Matcom Add-in所需Matlab compiler和C/C++数学库文件到VC++目录中。
2) 在VC++环境中配置Matcom Add-in。
启动VC++ 6.0后,点击菜单命令Tools Customize,在弹出的对话框中选择Add-ins and Macro files,点击Browse,然后选择插入文件类型为.dll文件。在Matcom的bin目录下找到mvcide.dll文件,点击OK, Visual C++ 6.0工具栏中便会出现如图1所示的Visual Matcom Add-in工具栏,表明安装成功,以后每次启动Visual C++,会自动加载Visual Matcom Add-in。
3) 在VC++的工程文件中完成代码编写。
根据具体问题需要创建相应的VC++工程,利用Matcom Add-in将用到的*.m文件加入到所创建的工程中。在需要调用*.m文件的首部添加#include “matlib.h”;和#include “*.h”;两个头文件包含语句。在调用代码开始处,要调用initM(MATCOM_VERSION)函数来初始化类库。在调用结束处,添加exitM();语句来结束类库调用。
2.2 Matcom Add-in使用中需注意的问题
通过Matcom Add-in能方便地生成独立应用程序,但在使用过程中需注意以下几点:
1) 添加到VC++工程的文件应当为一个M函数文件;
2) 当所编译的.m文件依赖于其它.m文件时,要把被调用的.m文件与要编译的.m文件放在同一目录下,并且在M函数文件中不要有图形、图像和消息显示语句[5];
3) 若需要修改代码,可以通过在VC++工作区中直接修改.m文件,然后重新编译即可。
3 Matcom Add-in 在图像处理程序中的应用实例
在视频判读时,常常需要对弱小目标进行判读。为了提高单帧图像弱小目标检测概率,为后续帧图像的准确判读打下基础,需要对弱小目标场景图像进行有效的预处理。为此,我们通过对现有算法的研究,提出了基于形态小波变换的弱小目标提取算法[6],通过Matlab仿真试验,表明采用该算法单帧弱小目标检测准确率在90%以上。
为了能够在某光测设备视频判读系统中,验证基于形态小波变换弱小目标提取算法的有效性,并且提高编程效率,缩短代码编写周期,我们采用Matcom Add-in混合编程技术,将该算法嵌入到了视频判读软件中,具体方法如下:
1) 安装并配置Matcom add-in。
2) 在VC++环境中打开光测设备视频判读系统的工程文件后,可以利用工具栏上的M文件加入按钮,把编写的基于形态小波弱小目标提取算法的M文件(newdetect.m)加入到该工程中。此时Matcom编译器将加入的newdetect.m及其所调用的函数编译成相应的.cpp文件,供其它调用文件使用。编译完成后,项目的工作区如图2所示,可以看到添加的Matlab M文件和对应生成的C/C++文件。
3)在VC++中添加代码,实现对弱小目标的自动判读,主要代码如下:
UINT Auto_JudgeProgram(LPVOID ThreadParam)
{…….
if( StatusInfo.m_nFileOffsetNum==0){
{initM(MATCOM_VERSION);//调用初始化函数
Mm m_oldBits;
m_oldBits =zeros(1,ImageInfo.InfoHeader.m_nImageSize);
m_oldBits =muint8(m_oldBits);
memcpy(m_oldBits.addr(),//原始图像拷贝
ImageInfo.DataInfo.m_pDIBData,ImageInfo.InfoHeader.m_nImageSize);
m_oldBits=rot90(reshape(m_oldBits,ImageInfo.InfoHeader.m_nImageWidth,ImageInfo.InfoHeader.m_nImageHeight));
Mm newTransed=newdetect(m_oldBits);//调用newdetect函数实现基于形态小//波的弱小目标提取算法
m_oldBits=muint8(newTransed);
m_oldBits=rot90(m_oldBits,-1);
memcpy(ImageInfo.DataInfo.m_pDIBData,m_oldBits.addr(),ImageInfo.InfoHeader.m_nImageSize);
exitM();//调用结束函数}
…….}
4) 编译运行VC++程序。为了便于观察,我们在图3中用白色方框标示出第1帧待判读弱小目标的位置,自动判读时第1帧弱小目标判读运行结果如图4所示。由运行结果可见,十字丝能够在自动判读过程中,正确标示出第1帧弱小目标的位置。
图3 第1帧判读的弱小目标图像 图4 采用Matcom Add-in混合编程技术的自动判读结果
4 结论
本文分析比较了Matlab和VC++混合编程的常用技术。重点介绍了Matcom Add-in混合编程的实现方法,通过该方法可以实现在VC++环境下调用自编的m函数以及Matlab工具箱函数,并且开发后的系统可以脱离Matlab环境独立运行。给出了在视频判读系统中应用Matcom Add-in进行混合编程的实例,采用该方法可以提高编程效率,缩短软件开发周期,为图像处理算法在实际系统中应用效果的快速验证提供了有效的途径。
参考文献:
[1] 董维国.深入浅出Matlab7.x混合编程[M].北京:机械工业出版社,2006.
[2] 黄金明,武玉强,邢西深.VC++与Matlab的混合编程研究[J].电脑开发与应用,2008,796:38-41.
[3] 张友兵,田漫柳.基于Matcom与VC混合编程的数字图像处理方法研究[J].湖北汽车工业学院学报,2005,19(1):38-40.
[4] 张季节.Matlab与VC接口在医学图像处理中的应用[J].医学信息,2009,22(8):1394-1397.
[5] 杨高波,亓波.精通Matlab7.0混合编程[M].北京:电子工业出版社,2006.
[6] LI Zhuo,Geng Qi-xian.An Image Preprocessing Algorithm of Weak and Small Target in Digital Video Interpretation System[C].Wuhan:IEEE,2010:388-390.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文