因为工作的原因,需要上手这种利用采集卡采集图像的相机。而正好使用的是Matrox家的采集卡,所以不可避免的接触到MIL。网上一搜,确实资料还是很少,而且,很多还是很久以前的,并不具有太大的参考性。而且,对于整个过程也没有讲的非常清楚。所以,我的这篇博客将会尽我所能,讲清楚如何利用这个采集卡写出代码。我使用的编程环境是:QT5.15 +VS2019。使用的采集卡是:Matrox EV 2MCLF采集卡
,使用的相机是:EV71YC2MCL8005-BA1
我在软件安装上面花了非常多的时间,首先给出两个软件下载的地址:
MIL-Lite 10软件链接提取码:4y4y
E2V相机驱动 密码:4tzz
安装MIL-Lite还有一件要做的事情就是下载drivermax,drivermax下载路径将两个必要的驱动给下载下来,下载的驱动如下:
下载完后,要重启系统,然后接下去做下面的步骤。反正自己扫描一下,缺什么补什么。弄完后,打开电脑的设置管理器看一下采集卡的端口有没有,看一下那个采集卡有没有出现,别是感叹号了。基本要出现下面这种情况:
对于MIL-Lite的安装就参考这个博客吧!首先,打开MIL-Lite时,要对MIL进行配置,这里我将配置文件也给出,到时直接导入就可以了。MIL配置文件链接,里面那个后缀是dcf的文件就是了。注意,要采集卡跟我同种类型的应该才可以配置成功。对于这个的配置你可以参考MIL配置参考博客。这里还有一个使用说明,你也可以稍微参考一下:E2V线扫相机使用说明。
打开E2v相机的驱动的时候,首先会出现下面这个界面:
一定要点No
,不然,你基本看不到后面的东西。
接下来,会不断地弹出后面的图片:
不断的点击Cancel。不要点OK.然后,如果你电脑性能可以的话。应该就可以看到:
这些就是这些相机的参数了。后面我会将这些参数在我的程序上面进行显示。
MILConfig
:分配和使用默认的系统和数字转换器设置。MappAllocDefault()
:要分配默认系统和数字转换器。MsysAlloc()与M_SYSTEM_DEFAULT
:一起使用以分配默认系统。MappAlloc
:这个函数的主要功能是:为你的应用创建一个控制和执行环境。使用完后记得MapFree
MIL_ID MdigAlloc(
MIL_ID SystemId, //in
MIL_INT DigNum, //in
MIL_CONST_TEXT_PTR DataFormat, //in
MIL_INT64 InitFlag, //in
MIL_ID *DigIdPtr //out
)
MdigAlloc()
结合使用,并将设备号和数据格式均设置为M_DEFAULT,以分配默认数字化仪。MdigGrab()或MdigGrabContinuous()
:可以通过数字转换器从摄像机中获取数据。MappAllocDefault()
被实现为宏。分配默认的数字转换器和显示,并分配和清除默认的可显示图像缓冲区。M_HOST_ADDRESS
:指向缓冲区或M_NULL的主机指针。 如果可供使用的话,该指针可用于直接访问数据主机CPU的MIL缓冲区。M_PHYSICAL_ADDRESS
:主机缓冲区的物理地址或M_NULL。 仅适用于非分页缓冲区映射在主机上。 使用这种类型的缓冲区仅供主机以外的总线主机访问中央处理器。MdigControl
控制采集时的比例(例如采集比例设为1/2,那么采集时从相机Buffer间隔取值,相当于相机Buffer为原来的1/2)。MdispZoom
控制显示的比例(例如显示比例设为2,那么显示时从PC Buffer线性插补为原来2倍)。
MdigGrab
:这是最常用的采集函数,但每次只能采集一个帧,存储在Millmage之中。
MdigGrabContinuous
:这是一个连续采集的采集函数,但注意,它并不会存储在PCbuffer之中,在最后一帧之前都是从相机Buffer直接总到显存Buffer的。直到最后一帧,才会储存在PCbuffer之中。
MdigProcess
:这个函数也是采图函数,不过,它在每一帧采集到的时候,都会调用它参数里面的回调函数,每来一帧调一次。相当于是帧事件驱动了这个回调函数。
下面这个是网上看的一些教程并做出的一些总结,也许对你有些许的指导意义。
MbufImport
:可以使用其自身的自动识别及分配能力,不必再单独定义导入图像类型和需要分配的内存大小const QString& fn; //fn为QString图像路径
LPCTSTR wFilename = (LPCTSTR)fn.utf16(); //QString转LPCTSTR
MbufImport((MIL_TEXT_CHAR*)wFilename,M_DEFAULT,M_RESTORE,Systemp,&SRC_MilImage);
Mil_ID
修饰的都是对象。ui->widget->setUpdatesEnabled(false);//在使用下面的功能前要先禁用更新
void MdispSelectWindow(
MIL_ID DisplayId, //in
MIL_ID ImageBufId, //in
MIL_WINDOW_HANDLE ClientWindowHandle //in
)
HWND ClientWindowHandle = (HWND)ui->widget->winId();//获取窗口ID
//允许鼠标实现缩放和拖动
MdispControl(m_MilDisplay, M_MOUSE_USE, M_ENABLE);
//允许覆盖显示图像内容
MdispControl(m_MilDisplay, M_OVERLAY, M_ENABLE);
//允许Disp缩放
MdispControl(m_MilDisplay, M_SCALE_DISPLAY, M_ENABLE);
//允许更改显示所在的window窗体标题
MdispControl(m_MilDisplay, M_WINDOW_TITLE_BAR_CHANGE, M_ENABLE);
MsysInquire
:获取系统设置。MdispSelectWindow
:Select an image buffer to display in a user-defined window. //model_subWin为禁用最大化子窗口的类
model_subWin->setWindowFlags(model_subWin->windowFlags() &~ Qt::WindowMaximizeButtonHint);
MmodInquire
:Inquire information about a specified Model Finder context, a specified model, or a specified result buffer.MbufAlloc2d
:Allocate a 2D data buffer.今天主要讲MmodDraw和 MgraControl、 MgraInquireList如何配合使用完成以下功能:
一、如何获取图像自定义的 MgraRect图像内容;
二、如何指定图像的绘制区域;
a. 在指定矩形区域内绘制
b. 在未指定区域内绘制
关于这个环境的配置确实花了非常多的时间,遇到了非常多的问题,所以,有一些教程和指引非常的重要,最好多跟供应商的那边多沟通沟通,希望能多获取一些支持。
如果有需要可以去看看我的另外三篇文章。感谢您的观看~
MIL开发实践(1)——开发环境的设置
MIL开发实践(2)——MIL实时采图
MIL开发实践(4)——E2v相机参数
若有错误,欢迎指出,感谢~