Computer Knowledge and Technology 电脑知识与技术 Computer Knowledge and Technology 电脑知识与技术Vol.8, No.8, March 2012.
E-mail: *************.cn 第8 卷第8 期 (2012 年3 月)
http://www.dnzs.net.cnTel:+86-551-5690963 5690964
VC++与 Matlab 混合编程实现光场光强的三维显示
杨入超
(铜陵学院 电气工程系,安徽 铜陵 244000)
摘要:基于VC++开发环境和Matlab 引擎函数,实现了激光衍射光场光强的三维动态显示。给出了实现过程和实验结果并进行了讨 论。 关键词:VC++;Matlab;引擎函数库;三维显示;衍射 中图分类号:TP391
文献标识码:B 文章编号:1009-3044(2012)08-1906-03
The Realization of Three Dimension Display of Optical Field by Mixed Programming of VC++ and Matlab YANG Ru-chao
(School of Electrical Engineering, Tongling College, Tongling 244000, China)
Abstract: Three dimension dynamic display of laser diffraction light intensity is realized by the method based on the development environ⁃ ment of VC++ and engine functions of Matlab in the paper. The realization steps and the result are presented and the result is discussed. Key words: VC++; Matlab; engine functions library; three dimension display; diffraction
科研与工程实际中常常需要实时测量光场的光强分布规律,目前市场上尚无这方面的测量设备,本文结合实验室已有的设备 进行了进一步开发,开发中采用了面阵CCD 技术以及VC++与Matlab 混合编程技术。
1 MATLAB 与VC++应用程序接口
1.1 MATLAB 与VC++应用程序接口
MATLAB 与Visual C++之间有4 种常见的接口:
1) 在Visual C++程序中利用MATLAB 引擎来调用MATLAB 函数; 2) 将MATLAB 程序编译成MEX 文件,与VC 程序进行链接; 3) Visual C++程序直接利用MATLAB 数学库调用MAILAB 函数; 4) 将MATLAB 下的.m 文件转换成VC 可调用动态链接库(DLL)。 方法1)、2)生成的程序需要在安装了Matlab 软件的系统中运行,而由方法3)、4)生成的程序可以脱离Matlab 环境。 本文采用的是方法 1),即 Visual C++调用 MATLAB engine。MATLAB engine 是一组函数,通过调用这组函数,用户可以在程序 中实现对MATLAB 的控制,完成计算或者绘制图形的任务,此时MATLAB 软件就相当于一个计算引擎。 1.2 MATLAB 引擎程序建立
下面介绍如何在C/C++中调用Matlab Engine
1) 在工程中加入Matlab Engine 的头文件路径和库文件路径
在菜单中选择 Tools-> Options-> Directories, 添加 engine.h 所在的路径,在笔者的计算机上路径是 D:\\MATLAB6p5\\extern\\in⁃ clude。类似的,在这个对话框的“Show directories for:”下拉菜单中选择 Library Files, 然后添加库文件的路径,路径是 D:\\MAT⁃ LAB6p5\\extern\\lib\\win32\\microsoft\\msvc60。
2) 接下来设定工程属性,在菜单中选择 Project-> Settings-> Link, 在 Object/Library Modules 中加入库文件链接 libmx.lib, libmex. lib, libeng.lib。
程序执行时后台会启动一个 Matlab 进程,这是与 Client 通信的 Server 端,如果希望隐藏这个窗口,需要在代码中加入这样一句:engSetVisible(ep, 0); 1.3 MATLAB 引擎函数
在 Matlab 引擎函数库中,共提供了 13 个 C 语言引擎函数。这些引擎函数在头文件 engine.h 中进行了声明。下面是 6 个常用引擎 函数:
1) engOpen:启动Matlab 引擎; 2) engClose 关闭Matlab 引擎;
收稿日期:2012-02-08 作者简介:杨入超(1981-),男,安徽和县人,铜陵学院电气系讲师
3) engGetVariable:从Matlab 工作空间中获取一个变量; 4) engEvalString:执行一个用字符串表示的Matlab 表达式; 5) engOutputBuffer:确定存放Matlab 输出结果缓冲区域;
6) engPutVariable:将mxArray 结构体类型变量输送到Matlab 工作空间中,并命名mxArray 结构体类型变量。
2 三维显示程序的创建
该研究的应用背景立足于激光衍射光场光强的三维图像信息的抽取,需要进行三维图像的显示和数字滤波的实现。在 Matlab的运行环境下,三维图象的显示只需要一个函数 mesh()就可以实现。假设图象数据存放在iTemp 二维数组中,VC 与Matlab 间的数据交换是通过 Matlab 引擎进行的。Matlab 提供一种专门的对象类型数组 mxArray 完成数据传递的任务。这里注意的是 Matlab 的数据是按列存储的。部分程序如下:
int i, j ;
double iTemp[300][740]; double array[740*300]; Engine *ep;
mxArray *T = NULL;
// 将二维数组iTemp 的数据存储到一维数组array 中 for(i=0; i<300; i++) for(j=0; j<740; j++)
array[j+i*740] = iTemp[i][j];
// 开始启动matlab 引擎 if (!(ep = engOpen(NULL))) {
MessageBox ((HWND)NULL, (LPSTR)\"Can't start MA TLAB engine\(LPSTR) \"VC_MATLAB\ MB_OK);
exit(-1); }
//矩阵的构造与赋值
T = mxCreateDoubleMatrix(740, 300, mxREAL);
memcpy((char *) mxGetPr(T), (char *) array, 740*300*sizeof(double)); //将变量T 输入到matlab 工作空间 engPutVariable(ep, \"T\
//通过matlab 引擎库的库函数engEvalString()调用内建的绘图函数 engEvalString(ep, \"mesh(T.’);\"); //关闭matlab 引擎 engClose(ep);
//析构结构体变量T mxDestroyArray(T);
3 实验结果与讨论
实验装置见图 1,选用交流电子稳压电源,可以提高激光器的稳定性。用偏振光减光器来调节激光光强,以便于 CCD 器件的采集。为了得到较好质量的三维光强分布曲线,可以在单缝与激光器之间放入一个小孔光阑限制激光束的大小。实验在暗环境中进行。光屏与单缝之间的距离尽可能的满足远场条件,缝宽在0.05~0.1mm 时,Z>1m 即可,这样就可以得到近似的夫琅和费衍射。
图1 测量装置示意图
上述三维显示程序是整个系统软件的一个部分,我们采用 CCD 摄像头对单缝衍射光场进行采集,再通过调用三维显示程序,就可以很形象的显示出三维光强分布,如图 2,Z 轴表示衍射光场光强的灰度值大小,X 轴和 Y 轴表示衍射光场的列数与行数。通过工具栏上的旋转按钮可以进行任何视点角度的观察。调用三维显示程序,能更准确,快速,方便的定量描述光的衍射。
从图 2 可以得知,当 x=0 时,光强为中央主极大值,光强最强,说明绝大部分的光能都落在中央明纹上,暗条纹是以中央明纹为对称轴的左右对称分布的,中央明纹两侧的亮纹强度逐次减弱,除了一级亮纹和二级亮纹之外,其他级次的亮纹都不明显,近似为 0。
Computer Knowledge and Technology 电脑知识与技术
第8 卷第8 期 (2012 年3 月)
4 小结
图2 激光衍射光强三维图
混合编程是综合使用多种开发工具技术优势的一种常用手段,本文通过对 VC++和 Matlab 的集成开发,实现了对二维衍射光场 光强的三维效果显示。Matlab 具有强大的信号处理函数库能实现信号生成、信号重抽样、各种积分变换等,对衍射光场光强的数据 的进一步处理提供了极大的方便。
参考文献:
[1] 王素立.MATLAB 混合编程与工程应用[M].北京:清华大学出版社,2008. [2] 苏金明. MATLAB 与外部程序接口[M].北京:电子工业出版社,2004.
[3] 李卓,李益民.Matlab 与VC++混合编程技术在图像处理中的应用研究[J].电脑知识与技术,2011,7(8):5450-5452. [4] 车敏,张红梅. Matlab 与VC 联合编程在数字水印工程中的应用[J].现代电子技术, 2010, 33(24):55-58.
(上接第1905页)
以把各个独立的功能模块实现为一个个插件,并能根据不同地方的用户的不同需求,在主框架中加载不同的功能模块,以实现整个 系统的功能集中,体现出系统的整体性。
6 总结
利用 Qt Embedded 作为测控装置的人机界面的图形开发工具包,通过对各个功能模块的细化,可以让系统设计更合理,模块结 构更独立,容易进行软件维护和代码二次开发,基于 Qt 插件方式应用程序框架设计的各个模块可以进行自由修改和替换,极大提高 了系统的可定制性。界面程序开发与使用以前的一些开发工具包比较起来,界面更美观,开发更快速。由于基于 Qt 应用程序开发 比较简单并且提供了大量的 API 函数库,对开发人员的要求比较低。通过 QVFB(Qt Virtual Framebuffer),开发人员在研发初期可以 在 PC 机上进行人机界面的开发和模拟调试,然后再移植到真正的装置上进行测试,大大的提高了开发效率。由于 Qt Embedded 优 秀的系统架构设计和理念,笔者相信会有越来越多的装置采用Qt Embedded 进行实现。
参考文献:
[1] 黄国方,徐云燕,奚后玮,等.新型超高压变电站测控装置的研制[J].电力系统自动化,2005,29(6):98-100. [2] 陈养平,贺占庄,白军元.基于VxWorks 的Zinc 程序设计[J].微电子学与计算机,2003,20(Z1):32-34.
[3] 陈喜春,黄波.基于Linux 和MiniGUI 的某型指控终端人机接口设计[J].现代电子技术,2010,33(14):25-28.
[4] Jasmin Blanchette,Mark Summerfield.C++ GUI Programming with Qt4[M].Second Edition.Pearson Education,Inc:Prentice Hall,2008. [5] 谭大鹏,李培玉,潘晓弘.基于Qt/E 的嵌入式工业监测轻型图形用户界面构件库开发[J].计算机集成制造系统,2009,15(2):399-405. [6] 任善全,吕强,钱培德,杨季文.一个基于Qt/Embedded 的嵌入式Linux 应用程序的实现[J].计算机应用与软件,2006,23(2):105-107. [7] Nokia Qt Official.Online Reference Documentation[EB/OL].http://doc.qt.nokia.com/,2010.
[8] 刘福才,赵佳伟,汤丽娜.基于嵌入式Linux 系统的Qt/Embedded 图像处理界面开发[J].计算机应用与软件,2009,26(11):116-117,149. [9] 王子强,刘海燕,李媛州.Linux 下图形用户界面程序的开发与实现[J].计算机应用与软件,2005,22(6):81-83. [10] 陈周国,王胜银,付国晴,邓赞.基于Linux QT 技术的远程监控GUI 设计[J].通信技术,2009,42(12):234-236. [11] 贾明,严世贤.Linux 下的C 编程[M].北京:人民邮电出版社,2001.
[12] 刘小春,张有为,向伟.嵌入式Linux 下Qt/Embedded 应用关键技术研究[J].微计算机信息,2007,23(35):62-63.
因篇幅问题不能全部显示,请点此查看更多更全内容