您好,欢迎访问三七文档
MIL编程环境设置MIL全称为MatroxImagingLibrary,由加拿大Matrox公司开发;MIL软件包是一个独立于硬件的、含有多个标准模块或组件的32位图像库,可以对图像进行采集、处理、分析、显示和存取操作,其功能覆盖图像领域的所有方面,使用起来也相当简单和方便;MIL-Lite是MIL的子集,含有MIL的部分模块,可以进行图像的采集、显示、存取操作,还可以在图像上进行图形操作及LUT变换等;MIL/MIL-Lite支持Matrox公司所有采集卡,如果应用程序采用其它公司的采集卡,则不能使用MIL/MIL-Lite的采集功能,但应用程序可以使用MIL/MIL-Lite的其它功能。那么要采用MIL进行应用程序开发首先就要设置开发环境,放好动态链接库位置,链接好导入库文件,引入必要的.h头文件。安装完MIL后(一般采取默认安装,即安装路径为C:\ProgramFiles\MatroxImaging),如下图其中Drivers为驱动文件,Images为示例图片文件夹,Intellicam为Intellicam软件,Mil为开发用的文件,Tools为辅助开发的一些工具,MILControlCenter.hta为控制中心,MILInstall.log为安装日志因为我们要进行开发,所以进到Mil文件夹中,如下其中DLL为MIL的各个模块的动态链接库,DOC为帮助文档,Examples为VC示例,Include为必要的头文件,LIB为导入库文件那么为了进行开发首先应该将Dll文件加入系统Path路径,便于编译时找到相应模块的Dll,这一步安装MIL时已经默认做好了,若意外没有设置,则可如下手工设置然后将头文件加入系统路径,如下图(注意要把Include和Include\mildyn都加进来,VC不会自己到include包含的文件夹中去搜索。)然后,再加入导入库的路径lib为了保证设置一次,以后再写mil程序时即可用,请保证当前没有打开任何工程和文件,否则VC即认为当前加入系统头文件路径只是针对当前工程,这个设置被写到当前文件的设置文件中(应该是.dsp文件),而并不是记录到VC软件中。这样当你新建另一个MIL工程后还得重新设置以上设置完以后,新建一MIL工程,要想用MIL功能,进行动态链接如下#pragmacomment(lib,mil.lib)#include在mfc中一般加在staAfx.h文件中其中mil.lib包含mil的基本功能,要想用其他的功能可以类似的引入(如,#pragmacomment(lib,milim.lib));mil.h实际上包含了很多其他模块的头文件,这里实际上同时引入了其他各个模块的头文件,当然也可以只引入需要的头文件这样就可以用MIL进行开发了当然这只是这其中的一种办法,你也可以将dll,lib,h文件全部拷贝到当前文件夹,再来开发应用程序,但本文这种方法简单易行,开发方便附加说明:引入DLL路径除了加入到系统Path变量中,还可以直接同VC添加LIB和INCLUDE目录一样添加DLL目录,效果是一样的。推荐使用添加到Path的方法,这样命令行编译不会出错。开发基础概念和步骤相对于开源的OpenCV来说商业化的MIL开发相对容易,只需要遵循特定的步骤即可以完成自己的开发。但是对于MIL中的一些基础概念还是要理解,不然可能在后面查看函数帮助时会混淆一些概念。MIL中有五大基本对象(这里的对象和C++的对象不一样额,不过也可以看成一样的,猜想也是一个结构体):Application、System、Display、Digtizer、Buffer。如下图是这5大基本对象的一个简单关系图。ApplicationApplication指的是你自己开发的一个应用程序,一般应用程序同一时刻只存在一个Application对象。主要用它来提供一个用于控制和执行MIL应用程序的基本环境。SystemSystem代表为一个包含CPU或GPU、内存或显存和图像控制器的单元分配的一个虚拟访问对象,例如一块Matrox图像板卡,一个电脑主机都可以被分配为一个System。System能够通过加上相机和显示器来采集、保存和显示。每个Application下可以包含多个System,这就好比一台电脑可以插上多块Matrox图像板卡。BufferBuffer对应一块内存,可以对它赋予不同的属性用来对图像作相应处理,如存储、显示、采集、处理,只有赋予了对应的属性的Buffer才能用于对应操作,只赋予了保存属性的Buffer是不能用于显示的。DigtizerDigtizer对应相机。它用于相机的采集和相机属性的调整等,和相机有关的操作都是靠它来完成。DisplayDisplay对应显示器。所有和显示的操作都是靠它来完成。这个在手册中提到了两种Display:一种是MIL内建的用于演示的Display叫AuxiliaryDisplay,它不适用于WindowsDesktop,主要用于和Matrox显卡配套使用的Screen,一般用不上,不予讨论;另一种是叫WindowedDisplay,一种是MIL用于演示的Display,不需要选择要显示的窗口句柄,默认分配的Display对象是此种display,另一种是用户选择要显示的窗口句柄,这个需要你自己选择在哪个windows窗体上显示对应的Buffer图像内容。值得注意的是:只要你的电脑配置足够好,内存足够大,每一个System下可以包含任意数量的Digtizer、Display和Buffer。但是,在同一时刻用于实际显示的Buffer和Display只能有一个,我的意思是尽管你可以分配多个,但是每一次你只能用一个,要用另一个的话你只需要做一个切换操作,这在后面多Buffer显示中会讲到。下面我以MIL手册上做一下修改来讲解,下面的源代码(新建一个Win32Console项目,复制代码到CPP文件中编译即可运行)演示了一个基本的MIL程序开发步骤。[cpp]viewplaincopyprint?1.#include2.#include3.4.#pragmacomment(lib,mil.lib)5.6.intmain(intargc,char*argv[])7.{8.MIL_IDMilApplication,/*Applicationidentifier.*/9.MilSystem,/*Systemidentifier.*/10.MilDisplay,/*Displayidentifier.*/11.MilImage;/*Imagebufferidentifier.*/12.13.//分配默认的应用14.MappAllocDefault(M_SETUP,&MilApplication,&MilSystem,&MilDisplay,M_NULL,M_NULL);15.16.//分配显示的图像Buffer17.MbufAlloc2d(MilSystem,500,500,M_DEF_IMAGE_TYPE,M_IMAGE+M_DISP,&MilImage);18.19./*初始化Buffer,内存中绘制相应图像*/20.MbufClear(MilImage,0L);21.MgraColor(M_DEFAULT,255L);22.MgraArcFill(M_DEFAULT,MilImage,200L,200L,10L,10L,0.0,360.0);23.MgraText(M_DEFAULT,MilImage,0L,0L,MIL);24.25./*图像Buffer内容显示到相应Display上,此后修改Buffer,Display自动刷新*/26.MdispSelect(MilDisplay,MilImage);27.28./*打印提示信息.*/29.printf(Acirclewasdrawninthedisplayedimagebuffer.\n);30.printf(Press31.getchar();32.33./*释放图像Buffer.*/34.MbufFree(MilImage);35.36./*释放默认应用分配的资源.*/37.MappFreeDefault(MilApplication,MilSystem,MilDisplay,M_NULL,M_NULL);38.39.return0;40.}可以看到最开始分配了Mil的对象,每个对象分配后都有一个MIL_ID类型的标识变量,Application和System是至少要有的,由于有存储和显示图像的需求,还要分配Buffer和Display,没有采集图像的功能,所以不需要分配Digtizer。最开始程序分配了系统默认的Application、System和Display,这里的Display类型就是前面提及的MIL内建的用于演示的display窗口。博客中代码文件下载链接://://采集和实时显示前面讲到的都是离线的图像获取方法,实际中我们做机器视觉都是在线采集图像和处理,处理结果决定了计算机要给出的控制信号如电机运动等,这样就实现了实时视觉反馈运动。MIL中的采集需要Matrox采集板卡的支持,本文中以实验室的MatroxHelios板卡为例讲解MIL的采集。1.采集系统构成谈到采集,首先必须理解一套完整的采集系统从硬件到软件的构成,下面采集系统示意图采用Matrox板卡、MIL软件,图中各种CPU、MCU、GPU交互通信的详细过程并没有表示出来,只是为了说明大概流程,实际过程中完整采集系统差别不大。(以后有时间我会考虑单独出一个机器视觉硬件系列博文,后话啦)对照上图,简要说明一下采图过程:光源照射下,物体反射光经过相机镜头在相机CCD(或CMOS)芯片上,这个过程成称为Capture,相机的时序控制器控制间隔一定的时间将CCD中的数据传输到相机的缓存Buffer中,这个过程称为Acquisition,注意如果这个Buffer的数据不及时取出来的话下次acquisition会覆盖以前的数据,相机连接到插入PCI-E接口上的Matrox板卡上,在板卡上的时序控制单元(Timecontrolunit)控制从相机中Buffer中拿数据,这一过程称为Grab,从相机buffer中拿的还是模拟信号,在板卡中会通过A/D单元做一个A/D转换,将拿到的数据转成相应量化的数值存到相应的MILbuffer中,这一过程称为Digtize。在这里Capture和Acquisition在相机(Camera)中完成输出的是模拟信号,这个相机是模拟相机,Grab和Digtize在相机采集板卡(FrameGrabber)中完成,一般这样的相机和板卡之间用的是CameraLink接口,也有用1394接口的,适用于高速采集的情况;也有相机将Capture、Acquisition、Grab、Digtize做在一起的,实际上这也是大多数普通工业相机(13fps-30fps)的做法,他们输出的是数字信号,称为数字相机,一般采用GigE、1394或USB接口。注意这里我用红字标识的四个英文单词Capture、Acquisition、Grab、Digtize,他们都可以翻译为采集
本文标题:MIL
链接地址:https://www.777doc.com/doc-7845778 .html