您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 边干边学机器视觉系列-图像采集部分
边干边学机器视觉系列图像采集部分当选定好机器视觉的软硬件平台后,下一步就是图像采集。本章将详细讨论基于USB摄像头的图像采集和工业相机的图像采集,大家可以根据手中硬件的不同而选读不同的部分。从软件的视角来看,尽管硬件不同,但编程的思路和模式是基本一致的。本文使用的工业相机是Panasonic的BP330,它是一款遵循CCIR标准的黑白相机,图像采集卡是NI公司的PCI-1407(任何标准制式的黑白模拟相机都可以接到PCI-1407)。把相机连接到PCI-1407后,即可在MAX下找到PCI-1407,点击Grab按钮,还可以采集到图像,如图3.1所示。图3.1在MAX里面采集图像如果你使用的是USB摄像头,那么请参考Error!Referencesourcenotfound.Error!Referencesourcenotfound.,运行imaqUSBexamples.llb中的Grab.vi。在软硬件正常工作的情况下,可以看到从USB摄像头中传出的图像,如Error!Referencesourcenotfound.所示。在进行机器视觉系统开发前,我们通常都会如上所示先验证软硬件是否能正常工作,以便后续开发。1.1采集单幅图像1.1.1基于图像采集卡的Snap操作采集单幅图像是基本的图像采集操作之一,对应的动作叫Snap。每次Snap时,图像数据先从相机传到图像采集卡,然后再传到计算机的内存(图像处理缓冲区)中去,如图3.2所示。图3.2Snap方式采集图像过程Snap方式的图像采集程序如图3.3所示:第1步:调用IMAQInit.vi完成图像采集板卡的初始化工作。第2步:调用IMAQCreate.vi为图像数据创建一个数据缓冲区。第3步:调用IMAQSnap.vi从图像采集板卡中读入一帧图像数据,并把它放入先前创建的数据缓冲区中,并放入Image中显示。第4步:当图像数据缓冲区被释放后,我们在前面板上将看不到采集的图像了,所以特地添加一个人为的延时程序,等待用户停止。第5步:调用IMAQClose.vi,释放占有的图像采集板卡。第6步:调用IMAQDispose.vi,释放占有的图像数据缓冲区。图3.3Snap范例程序单幅图像采集的运行结果,如图3.4所示。图3.4单幅图像采集读到这里,大家可能跟我一样都有一个疑问,为什么必须有第二步和第六步,即创建图像数据缓冲区和释放图像数据缓冲区。这是因为每帧图像的数据量都特别大,如果在处理图像的过程中直接传递图像数据,则非常耗时。昀好的方式是仅仅传递指向该数据缓冲区的引用。IMAQCreate.vi完成的就是创建图像数据缓冲区并返回指向该数据缓冲区的引用的过程。1.1.2基于USB摄像头的Snap操作USB摄像头的Snap操作的程序实现与上面的基本相同,只需要用IMAQUSB函数选板中的函数替代相应步骤即可,如图3.5所示。图3.5USB摄像头Snap范例程序USB设备在正常工作以前,第一件要做的事就是枚举,所以USB摄像头在进行初始化前,需要先执行第0步,枚举系统中的USB摄像设备,接着:第1步:调用IMAQUSBInit.vi完成USB摄像设备的初始化工作。第2步:调用IMAQCreate.vi为图像数据创建一个数据缓冲区。第3步:调用IMAQUSBSnap.vi从USB摄像设备中读入一帧图像数据,并把它放入先前创建的数据缓冲区中,并放入Image中显示。第4步:当图像数据缓冲区被释放后,我们在前面板上将看不到采集的图像了,所以特地添加一个人为的延时程序,等待用户停止。第5步:调用IMAQUSBClose.vi,释放占有的USB摄像设备。第6步:调用IMAQDispose.vi,释放占有的图像数据缓冲区。USB摄像头Snap范例程序运行结果如图3.6所示。图3.6USB摄像头Snap范例程序运行结果1.1.3使用Snap.vi进行连续图像采集的速度问题在实际工程应用中,连续图像采集的应用占绝大多数。当我们会使用Snap.vi后,很自然的想到昀简单的连续采集图像实现方式是把Snap.vi放到While循环中,如图3.7所示。图3.7使用Snap进行连续图像采集在While循环中,加入可以计算每次循环消耗的时间。运行上述程序,可以看到使用Snap进行连续图像采集时,获得每帧图像所消耗的时间高达120ms(不同的系统,时间略有不同),如图3.8所示。换句话说,在这种方式下,每秒钟只能获得大约8帧图像,这种速度在大多数实际应用中是不能容忍的。图3.8120ms采集一帧图像为实现高速的连续图像采集,NIVisionModule提供了一个专用于连续图像采集的VI,IMAQGrabAcquire.vi,。下节本文将详述如何进行连续图像采集。1.2采集连续图像IMAQSnap.vi运行速度之所以会慢,是因为IMAQSnap.vi除了实现图像数据采集的操作外,还实现了许多初始化和资源释放的操作,大家可以双击IMAQSnap.vi,看看IMAQSnap.vi的实现过程,如图3.9所示。图3.9IMAQSnap.viPS.看NI提供的VI的内部实现方式是一种很好的学习方式。——代码阅读了解了速度慢的原因后,很自然的想到,既然是连续采集,何不把许多雷同的初始化操作提取出去,在每次连续采集开始时,仅做一次初始化就可以。为实现快速的连续图像采集,NIVisionModule提供了两个VI,一个是IMAQGrabSetup.vi,另一个是IMAQGrabAcquire.vi。IMAQGrabSetup.vi负责每次连续采集前的初始化,IMAQGrabAcquire.vi专注于图像采集。1.2.1基于图像采集卡的Grab操作基于图像采集卡的连续图像采集的实现代码如图3.10所示。图3.10连续图像数据采集第1步:调用IMAQInit.vi完成图像采集板卡的初始化工作。第2步:调用IMAQGrabSetup.vi初始化Grab过程。第3步:调用IMAQCreate.vi创建图像数据缓冲区。第4步:调用IMAQGrabAcquire.vi快速采集图像数据。第5步:调用IMAQClose.vi,释放占有的图像采集板卡。第6步:调用IMAQDispose.vi,释放占有的图像数据缓冲区。使用IMAQGrabAcquire.vi,采集每帧图像的时间从120ms降到了40ms,如图3.11所示。图3.11IMAQGrabAcquire运行结果1.2.2基于USB摄像头的Grab操作同上,USB摄像头的Grab操作的程序也与基于图像采集卡的实现过程基本相同,如图3.12所示:第0步:调用IMAQUSBEnumerateCamera.vi枚举USB摄像头。第1步:调用IMAQUSBInit.vi完成USB摄像头的初始化工作。第2步:调用IMAQUSBGrabSetup.vi初始化Grab过程。第3步:调用IMAQCreate.vi创建图像数据缓冲区。第4步:调用IMAQUSBGrabAcquire.vi快速采集图像数据。第5步:调用IMAQUSBClose.vi,释放占有的USB摄像头。第6步:调用IMAQDispose.vi,释放占有的图像数据缓冲区。图3.12USB摄像头的连续图像采集过程使用IMAQUSBGrabAcquire.vi实现连续图像采集后,采集每帧图像的时间下降到了35ms毫秒左右,如图3.13所示。图3.13USB摄像头连续图像采集结果
本文标题:边干边学机器视觉系列-图像采集部分
链接地址:https://www.777doc.com/doc-1436704 .html