在网上找到了matlab写成的一个图像与模板匹配的程序,但是VB无法调用。有没有高手可以帮忙转成VB可以调用的dll文件。
要求是输入主图像和模板图像的两个路径参数,DLL函数匹配完后返回目标位置的坐标参数。
[email protected]
源程序如下,需要改动一下删除掉图像显示的功能只需要返回目标位置坐标就可以。%-----------------------------------------------------------------
%无输入参数
%无输出参数
%函数说明:归一化相关系数
%-----------------------------------------------------------------
clear all ;
T1 = imread('2K612MV_Mark0.bmp'); %打开模板图像,存储在矩阵T1
S1 = imread('2K612MV_MAIN0.bmp'); %打开主图像,存储在矩阵S1
tic ; %计时 c = normxcorr2(T1(:,:,1),S1(:,:,1)); %归一化相关
[max_c, imax] = max(abs(c(:))); %求归一化相关系数的最大值点[ypeak, xpeak] = ind2sub(size(c),imax(1));
offset = [(xpeak-size(T1,2))
(ypeak-size(T1,1))];
xoffset=offset(1)+1 %图像匹配的X坐标
yoffset=offset(2)+1 %图像匹配的Y坐标time = toc %显示时间figure,imshow(S1); %显示图像rectangle('Position',[xoffset,yoffset,size(T1,2),size(T1,1)],...
'EdgeColor','r'); %用红色矩形框出目标物体
要求是输入主图像和模板图像的两个路径参数,DLL函数匹配完后返回目标位置的坐标参数。
[email protected]
源程序如下,需要改动一下删除掉图像显示的功能只需要返回目标位置坐标就可以。%-----------------------------------------------------------------
%无输入参数
%无输出参数
%函数说明:归一化相关系数
%-----------------------------------------------------------------
clear all ;
T1 = imread('2K612MV_Mark0.bmp'); %打开模板图像,存储在矩阵T1
S1 = imread('2K612MV_MAIN0.bmp'); %打开主图像,存储在矩阵S1
tic ; %计时 c = normxcorr2(T1(:,:,1),S1(:,:,1)); %归一化相关
[max_c, imax] = max(abs(c(:))); %求归一化相关系数的最大值点[ypeak, xpeak] = ind2sub(size(c),imax(1));
offset = [(xpeak-size(T1,2))
(ypeak-size(T1,1))];
xoffset=offset(1)+1 %图像匹配的X坐标
yoffset=offset(2)+1 %图像匹配的Y坐标time = toc %显示时间figure,imshow(S1); %显示图像rectangle('Position',[xoffset,yoffset,size(T1,2),size(T1,1)],...
'EdgeColor','r'); %用红色矩形框出目标物体
解决方案 »
- ie有缓存和历史记录等这些东西,而且这些缓存文件大了的话好像运行速度就会下降.问下webbrowser是不是也是这样的?如果是的话那要怎么清空webbrowse
- VB发送邮件的问题?
- 往access中添加记录,如果超过了最大允许字符长度,该怎么办?
- ACCESS加密后错误
- 怎么把剪贴板清空呢?
- 使用adodc添加记录,当update的时候,提示:多步操作产生错误....是什么原因?(100分)
- 关于字段绑定和datachange的问题,请高手帮忙解答,急!
- 在VB中怎样连接SQL Sever 数据库(要求用代码,不准用控件)?
- 急!请教高手
- 复制图片
- ASP怎么实现图片按比例缩小
- 求助:access2007 子窗体里的数据筛选问题
一、借助 ActiveX部件
Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用。
Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述:
● BSTR Execute([in] BSTR Command);
BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。
● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi);
该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。
● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi);
该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。
示例代码如下:
Dim Matlab As Object ’声明对象
Dim MReal1(5,5) As Double
’声明存放实部的Double型数组
Dim MImag() As Double
’声明存放虚部的Double型数组
Set Matlab=CreateObject(“Matlab.Application”) ’初始化对象
Matlab.Execute(“a=hilb(5)”)
’执行Matlab命令
Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag)
’将结果分别存入实部、虚部数组
二、借助DDE技术
DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab作为服务器时与其他应用程序的通信机制。
借助DDE时应用程序通信机制
其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供。
初始化会话时,客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic(会话主题)。
下面的示例说明了VB与Matlab建立并完成DDE会话的全过程:
说明: TextInput是输入文本框,TextOutput是输出文本框。在TextInput中输入Matlab命令回车后,由Matlab在后台执行并将结果返回给TextOutput显示。
Sub TextInput_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn then
’初始化TextInput与Matlab间的DDE会话
TextInput.LinkMode = vbLinkNone
TextInput.LinkTopic = “MATLAB|Engine”
TextInput.LinkItem =“EngEvalString”
TextInput.LinkMode = vbLinkManual
szCommand = TextInput.Text
’执行Matlab命令
TextInput.LinkExecute szCommand
TextInput.LinkMode = vbLinkNone
’初始化TextOutput与Matlab间的DDE会话
TextOutput.LinkMode = vbLinkNone
TextOutput.LinkTopic = “MATLAB|Engine”
TextOutput.LinkItem =“EngStringResult”
2005-5-30 11:48 回复
221.11.45.* 2楼TextOutput.LinkMode = vbLinkManual
’返回执行结果并显示
TextOutput.LinkRequest
TextOutput.LinkMode = vbLinkNone
End If
End Sub
三、通过M文件
Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件,然后在VB中声明下面三个API函数,最后使用Shell命令即可实现VB与Matlab的无缝集成。
1. 用mcc生成独立的外部应用程序。可使用如下两种命令:
mcc -p file.m 或 mcc -m file.m
2. 在VB中声明调用的三个API函数:
● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
● Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long
● Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long
3. 示例代码:
Dim lTask As Long, lret As Long, lHandle As Long
’执行file.exe文件
lTask = Shell(“file.exe”, vbNormalFocus)
lHandle = OpenProcess(SYNCHRONIZE, False, lTask)
’等待进程执行完毕
lret = WaitForSingleObject(lHandle, INFINITE)
lret = CloseHandle(lHandle)
’ file.exe文件执行完毕后,继续执行应用程序
……
通过以上编码,应用程序可以在执行过程中调用.EXE完成特定的计算或图形功能后,再继续其执行过程,从而实现与Matlab的集成。
四、引入MatrixVB
MatrixVB是MathWorks针对VB提供的一个Matlab库,它提供了600多个函数,包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等,为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难。
MatrixVB是一个独立的产品(可以从www.mathworks.com得到),其使用十分方便。MatrixVB安装完成后,只需在VB工程中引用Mmatrix即可。
示例代码如下:
说明: 工业生产中经常需要对采集到的原始信号进行分析,并对分析结果进行实时的图形化显示,下面通过在VB中引用Mmatrix来实现这一功能。代码如下:
Dim ax as Variant ’声明坐标轴
Private Sub Form_Resize()
vbrefresh ax ’刷新坐标轴
End Sub
Private Sub Form_Load()
ax = vbaxes(Form1.hWnd)
’将坐标轴置于窗体
Call Form_Resize
End Sub
Private Sub Command1-Click()
Dim I,C As Matrix ’声明向量
Dim m As Integer
’从数据库中取原始信号存入一维向量I,取其对应的碳含量存入一维向量C
’m为向量I、C的元素个数
Call Icheck ( I , C , m )
’调用校正函数
End Sub
Private Sub Icheck (I As Variant, C As Variant, ByVal m As Integer)
Dim II,CC,Z As Matrix
Dim a0,a1,a2 As Double
II = zeros(m,1)
CC = zeros(m,1)
II(colon(1,m)) = I(colon(1,m))
CC(colon(1,m)) =C(colon(1,m))
’多项式拟和求解
Z = polyfit ( II, CC, 2 )
’2 说明用二项式拟和
a0= Z.r1(1) ’a0为二次项系数
a1= Z.r1(2) ’a1为一次项系数
a2= Z.r1(3) ’a2为0次项系数
Clear axes ’清除坐标轴
T = Sort ( II )
’对原始信号排序,以确定作图区间
J = Linspace (T(1).r1(1),T(1).r(m),20)
’横坐标向量
Cuv = plus (plus (times (a0,times (X,X) ),
times (a1,X) ),a2) ’纵坐标向量
Tmp = plot (J,Cuv) ’绘制曲线
Hold (“on”)
Tmp = plot (II, CC,“r.”) ’绘制点
Hold (“off”)
End Sub
执行以上代码,结果如图2所示: 总 结
以上几种方法对于Matlab与VB的集成都是行之有效的,但在实际应用中究竟采用哪一种方式应视具体情况而定。前两种方式比较适合Client/Server模式,后两种方式则应视应用系统的具体要求来做选择,相比较而言,借助M文件在执行效率上略高一筹,而引入MatrixVB在使用上更为方便。总而言之,Matlab与VB集成可大大提高开发效率,对于解决工程问题是十分有意义的。
2005-5-30 11:48 回复
222.28.50.* 3楼Matlabvb库 详情:http://matlabvbvc.blog.163.com/ 下载: http://matlabvbvc.blog.163.com/blog/static/27873611200731925620985/ Matlabvb库包括数学运算、功能强大线性代数、图形处理等功能和部分神经网络,用于扩展 MATLAB 的功能和运行速度,可以作为独立的工具使用,支持生成自己的独立运行程序,不要求客户电脑装有matlab。 在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难,可大大提高开发效率,对于解决工程问题是十分有意义的。 matlab,vb,接口,神经网络,matlabvb库,activex,dll,com组件,matlab接口 优点: 1数学运算 2功能强大线性代数,矩阵计算 3图形处理 4 使用简单,对有matlab基础的更方便 4.1只需在VB工程中引用Matlabvb即可。 4.2 Mb1.Visible = False Mb1.StartMb argsIn=TextIn ‘StrIn= “a=[1:5];b=3*a” Call Mb1.SetArgsIn(argsIn) ‘输入 Call Mb1.EXE TextOut = Mb1.argsOut ‘输出 Call Mb1.EndMb 4.3打包程序,把文件夹bin,toolbox,java,sys,文件matlabvb.ocx(要注册)带上即可。 5 把输入argsIn 设为字符串输入就可以了,不用“;”限定的变量就是输出值String型 6 argsIn能够容错中文字符,回车符等,注释符%,可以把matlab的脚本文件复制运行。 7 可以获得数组double型变量 Call Mb1.GetVar 8 可以获得复数数组double型变量的实部和虚部 Call Mb1.GetVarReIm 9 在vb和matlab之间互相交换数据,弥补argsIn中的for 循环慢的情况,增强vb的矩阵计算处理功能(在vb中循环,在matlab中计算)。 10支持部分神经网络函数,支持bp神经网络,及其改进的bp神经网络和rbf神经网络 11 可以生成独立运行程序,不要求客户电脑装有matlab。
详情:http://matlabvbvc.blog.163.com/
下载: http://matlabvbvc.blog.163.com/blog/static/27873611200731925620985/