您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VC++与Matlab混合编程及其在轮辋裂纹检测中的应用
VC++与Matlab混合编程及其在轮辋裂纹检测中的应用刘亚楠,郭三华,涂铮铮,罗斌(安徽大学计算智能与信号处理教育部重点实验室,合肥230039)摘要:本文结合轮辋裂纹检测系统介绍了几种VC++与Matlab混合编程的方式,并具体分析了它们在轮辋裂纹检测中的可行性,得出了在轮辋裂纹检测中可以采用Matlab引擎的结论。最后结合边缘检测、形态学运算、最优阈值分割等多种方法,采用Matlab引擎较好地实现了轮辋裂纹检测,取得了理想的效果。实验表明该方法在轮辋裂纹检测系统的开发中大大提高了编程效率。关键字:混合编程裂纹检测Matlab引擎MixedProgrammingofVC++withMatlabandItsApplicationinWheelCrackDetectionSystemYananLiuSanhuaGuoZhengzhengTuBinLuo(KeylabofIntelligentComputingandSignalProcessingofAnhuiUniversity,Hefei230039)Abstract:ThispaperintroducesseveralmixedprogrammingmethodsofVC++andMatlabbasedonthewheelcrackdetectionsystem,andconcretelyanalysisesthefeasibilityoftheminwheelcrackdetectionsystem,elicitingtheconclusionofusingMatlabengineincrackdetectionsystem.Torealizethewheelcrackdetectionsystem,weusethemethodofMatlabenginecombinedwithedgedetectionalgorithm,morphologicaloperation,optimalthresholdsegmentation,etc,andgettheperfecteffect.Theexperimentsindicatethattheprogrammingefficiencyisimprovedinthedevelopmentofthewheelcrackdetectionsystemusingtheproposedmethod.Keywords:mixedprogramming,crackdetection,Matlabengine1引言Matlab是当今最优秀的科技应用软件之一,它具有高效的科学计算功能与可视化功能,又有强大的图像处理功能。它简单易用,不需要用户有高深的数学知识和程序设计能力,也不需要深刻了解算法及编程技巧,具有开放式可扩展的工作环境。Matlab语句功能十分强大,一条语句可完成十分复杂的任务。Matlab软件中所包含的Matlab源代码相当于70万行C代码。特别是所附带的30多种面向不同领域的工具箱支持,使它成为许多科学领域的基本工具和首选平台。但是,它是以解释方式运行的高级语言,执行效率低;同时,Matlab程序不能脱离其环境运行,不能被用于开发商用软件。而对于另一种程序设计工具VC++6.0,它具有较高的编码效率,可以快速的开发出Windows环境下图形界面丰富的应用软件系统,但是,在进行较复杂的图像处理时,需要编出大量的代码。本文通过Matlab与VC++语言的接口,可以实现两种语言的混合编程,优势互补,提高编程效率,会大大地加快一些算法的实现,同时其可靠性也很高,可以开发出高质量的图象处理软件。轮辋裂纹检测系统采用数字图像处理技术,利用CCD摄像头摄取车轮轮辋的运动图像,将其数字化后送往计算机处理,提取裂纹的特征,实现车轮轮辋表面裂纹的在线检测。如图1所示:依据裂纹检测相关算法,我们采用Matlab与VC++语言混合编程来进行轮辋裂纹检测系统的开发,Matlab与VC++混合编程存在以下几种主要方式,我们根据这几种方式的各自特点来分析在轮辋裂纹检测系统中应该采用哪种方式来实现处理。作者简介:刘亚楠(1984-),女,硕士研究生,山东济宁人,研究方向为数字图像处理。郭三华,男,硕士研究生。涂铮铮,女,硕士研究生。罗斌,男,教授,博士生导师,研究方向为数字图像处理与模式识别。图1系统原理框图2VC++与Matlab混合编程的几种方法]2][1[(1)利用Matlab编译器实现与VC的连接这种方法需要编辑一个.m文件,并且它必须是一个函数文件,而不能是一个脚本文件。假设为lyn.m。利用Matlab提供的mcc编译器命令将.m文件转化为VC++下可以调用的动态链接库文件。这里需要注意的是由于Matlab6.5下的编译器版本是3.0的,而在Matlab7.0下编译器版本是4.1的,所以,所用编译器命令不一样,并且生成的文件也不一样。具体区别如下:在Matlab6.5中mcc编译器命令为:mcc-t-Wlibhg:lyn03-Tlink:lib-hlibmmfile.mliblyn.m生成的文件中包含lyn.clyn.h及.m文件中调用的函数所对应的头文件和源文件。所要调用的函数定义如下:externmxArray*mlfLyn(void);externvoidlyn03Initialize(void);externvoidlyn03Terminate(void);在Matlab7.0中mcc编译器命令为:mcc–Wlib:lyn03–Tlink:liblyn.m生成的文件中已经不再包含lyn.clyn.h。而且,对于所有.m文件都只生成8个文件。.m文件内所包含的函数对应的源文件和头文件都被封装起来,大大节省了存储空间。所要调用的函数定义也有很大的不同,主要表现在mlfLyn()函数上,函数定义如下:externvoidmlfLyn(intnargout,mxArray**y);其中nargout为所有函数的输出变量数目,y为输出变量。对于一般只涉及到数学库函数的.m文件只调用这三个函数即可。但是,对于包含图象处理工具箱中的函数的.m文件,在Matlab6.5下是不能编译的。故在轮辋裂纹检测系统中不能采用这种方式。(2)利用matcom实现与VC的连接紫外光源检测对象(轮辋)CCD摄像头图像采集器计算机(检测裂纹特征)输出、报警有两种方法可以实现这种连接:运行MIDEVA,在主界面上直接打开.m文件,在菜单中选择compiletodll,输入lyn,找到lyn.cpplyn.h加入工程]3[;点击VC菜单项Tools-Customize。在弹出的对话框中选择Add-insandMacrofiles,点击Browse,选择插入文件类型为.dll文件,在Matcom的bin目录下找到mvcide.dll,点击OK,VC的工具栏上就会出现新的工具栏]4[。采用第二种方法点击工具栏上的按钮就可以把.m文件以及与它相关函数的的源文件、头文件、库文件v4501v.lib自动加入工程中,非常方便。Matcom提供了matlab中.m文件与其他高级语言的接口,使.m文件可以编译为脱离matlab环境独立执行的可执行性程序,这样提高了代码的复用率,提高了代码的执行速度。使纯文本的.m文件变为二进制的可执行程序,增加了知识保护的安全性。它提供了近千个数学函数,对于其他高级语言编译器来说,提供了一个丰富的数学库,在matlab上能用的常用函数基本上都可以在高级语言中直接调用。所以对于涉及数学函数的.m文件来说,采用这种接口方法很方便。但是需要注意的是由于在.m文件中所调用的函数文件也要与该.m文件在同一目录下,同时进行编译。而对于轮辋裂纹检测系统,它的算法中调用的函数文件有很多,要把这些函数都放在同一个目录下需要一定的时间,另外,Matlab中的图形、图象显示函数不能被调用,需要通过VC编程实现,所以,这种方法在轮辋裂纹检测系统中并不方便实现。(3)用Matlab引擎调用Matlab函数Matlab引擎采用客户/服务器计算方式。在运用中,C++语言的程序作为前端客户机,向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息。这种方式下,Matlab相当于一个计算引擎。它以独立进程的形式工作在后台,有以下优点]3[:①Matlab引擎可以与应用程序运行在网络中不同的机器上,这样就能够将计算任务繁重的引擎程序放置到网络上计算速度较快、计算能力较强的机器上,充分利用网络资源,加快这个系统的速度,在另外的机器上实现应用程序的用户界面。②由于应用程序和引擎是两个独立的进程,Matlab引擎不需要将整个庞的Matlab系统与程序连接,只需要把小部分的引擎通信库与程序相连,节省了大量的资源。另外,和以上所介绍的接口方式相比较来说Matlab引擎所提供的Matlab功能最全面,可以完成任何计算和图象处理工作,而且利用Matlab引擎调用工具箱中的函数可节省大量的系统资源,虽然不可脱离Matlab的环境运行,但是应用程序整体性能较好并且它的设置很简单,只需要在源文件中加入#include“engine.h”,把libeng.liblibmx.lib引入工程即可。所以在轮辋裂纹检测系统中这种方法可行。下面我们就用这种方式来实现轮辋裂纹检测系统。3实例分析本文基于VC++6.0和Matlab7.0利用matlab引擎实现对轮辋裂纹检测。裂纹检测方法是:首先利用Canny算子检测图像边缘,从而可以提取连续而完整的边缘,然后用形态学的二值膨胀消除双边缘之间的间隙,再用腐蚀、细化算法平滑、细化粗边缘,使得边缘在宽度上更接近原始目标,得到第一个处理结果图;对原图进行傅立叶变换处理,再用最优阈值分割]5[得到第二个处理结果图;然后将两个结果图做点乘运算,最后使用模板去除残留的噪点]6[,得到最终的裂纹检测结果。Matlab实验中所用文件:tanshang.m。在把libeng.liblibmx.lib引入工程时可以采用方法:在C:\MATLAB701\extern\lib\win32\microsoft\msvc60目录下找到libeng.liblibmx.lib引入工程。也可以采用[3]中的方法:利用命令lib/def:Matlab的安装路径C:\MATLAB701\extern\include\*.def/machine:ix86/out:*.lib来生成程序所需的静态链接库libeng.liblibmx.lib,将libeng.liblibmx.lib所在的目录加入VC++project/link/object/librarymodules目录下即可。本文采用第一种方法。主要代码如下:Engine*ep;if(!(ep=engOpen(NULL))){fprintf(stderr,\nCan'tstartMATLABengine\n);exit(-1);}engEvalString(ep,a=imread('tansh.bmp'););engEvalString(ep,x=mat2gray(a););engEvalString(ep,[M,N]=size(x););engEvalString(ep,x=fenge(x,M,N););engEvalString(ep,x=quban(x,M,N););engEvalString(ep,imwrite(x,'kk1.bmp'););engEvalString(ep,BW1=edge(a,'canny',0.5););engEvalString(ep,se1=strel('line',4,90););engEvalString(ep,se2=strel('line',4,0););engEvalString(ep,BWsdil=imdilate(BW1,[se1se2]););engEvalString(ep,y=imread('kk1.bmp'););engEvalString(ep,z=y&BWsdil;)
本文标题:VC++与Matlab混合编程及其在轮辋裂纹检测中的应用
链接地址:https://www.777doc.com/doc-2854538 .html