很明显,图像的采集是所有机器视觉应用中必须解决的问题,HALCON提供了为各种图像采集设备执行这种交互的接口,图像采集的任务被简化为几行代码,只需几个操作符的调用,更重要的是,这种简单并不是以限制可用功能为代价。使用HALCON,可以在不同的时间模式下从不同的采集设备和相机中获取图像。除了从相机中获取图像外,HALCON还可以将存储在文件中的图像显示出来(支持的文件格式:BMP、TIFF、GIF、JPEG、PNG、PNM、PCX、XWD)。
基本概念
用HALCON获取图像基本上只需要三个步骤,而从文件中读取图像则更为简单:只需调用read_image操作符即可。
打开图像采集设备
如果想从一个摄像机中获取图像,第一步就是要连接到这个设备。HALCON可以解决所有与设备相关的细节问题;只需要调用算子 open_framegrabber,指定相应的图像采集接口名称。
还有一个 "虚拟 "的图像采集界面叫File。顾名思义,这个 "抓帧器 "读取文件中的图像,以及所谓的图像序列文件。后者是Halcon特有的文件类型,典型的扩展名是.seq,它们包含一个图像文件名的列表,用新的行隔开(可以用文本编辑器很容易地创建它),如果你链接到这样的序列,随后调用grab_image就会返回文件中指定的序列图像。 然后,不必创建一个序列文件,而只需指定目录名称而不是序列文件作为参数'CameraType'的值。后续调用grab_image会返回在指定的图像目录中找到的图像。如果想用图像文件序列或者在真实的图像采集设备上来测试应用程序,那么以上这两种方法都很有用。
获取图像
连接到设备后,只需调用grab_image就可以获取图像。
要从磁盘中加载图像,需要使用read_image,图像会在当前目录中和当前设备环境变量HALCONIMAGES指定的目录中被搜索到。
关闭图像采集设备
在应用程序结束时,可以使用运算符close_framegrabber关闭与图像采集设备的连接以释放其资源。
例子
如前所述,从文件中获取图像调用对应的一个运算符:
read_image(Image,'particle')
下面的代码处理从图像序列中读取的图像:
SequenceName:='pendulum/pendulum.seq'
open_framegrabber('File',-1,-1,-1,-1,-1,-1,'default',-1,'default',-1,'default',SequenceName,'default',-1,-1,AcqHandle)
while(ImageNum<=MaxImageNum)
grab_image(Image,AcqHandle)
...处理图像...
ImageNum := ImageNum+1
endwhile
扩展概念
在实际应用中,通常不需要让摄像机来获取图像,而重要的是在正确的时刻或速率下获取图像,并且摄像机和图像采集接口都要有合适的参数。因此,HALCON允许进一步参数化采集过程。在HDevelop中,通过菜单项Assistants>Image Acquisition提供了一个助手,它可以帮助选择图像源,调整参数,并生成合适的代码。
打开图像采集设备
当用open_framegrabber连接到图像采集设备时,主要参数是对应的HALCON图像采集接口的名称,因此,会得到一个所谓的handle,可以用它来访问该设备,例如,用grab_image或grab_image_async来采集图像。
通过open_framegrabber的其他参数,可以描述图像采集设备和摄像机的配置,在这里使用更多完整的配置时是必要的,例如,多个摄像机连接到不同的采集卡的不同端口。更多的参数允许指定所需的图像格式(尺寸,分辨率,像素类型,颜色空间)。这些参数中大多数都有默认值,如果想使用这些参数,可以使用指定 "default"(字符串参数)或 -1(数字参数)。
通过算子info_framegrabber,可以查询接口的版本号、可用的板卡、端口号和摄像机类型等信息。
设置参数
如上所述,在连接到图像采集设备时,已经设置了一些参数,如open_framegrabber。这些参数(图像采集设备/摄像机的配置和图像大小等)是所谓的通用参数,因为它们几乎是所有图像采集接口所共有的。然而,图像采集设备在所提供的功能上有很大的不同,导致了有更多的特殊参数。这些参数可以通过算子set_framegrabber_param进行自定义。
通过算子get_framegrabber_param,可以查询普通参数和特殊参数的当前值。
采集图像
实际上,在实际机器视觉应用中,不会使用算子grab_image来获取图像,而是使用grab_image_async。这两个操作符的区别如下。如果在循环中获取和处理图像 grab_image总是请求获取一个新的图像,然后暂停程序,直到获取完成。然后,对图像进行处理,之后,程序等待下一张图像。相反,当使用 grab_image_async 时,图像的采集和处理是并行的。当一幅图像 处理完毕,下一张图像已经在采集中,大大加快了应用程序在处理图像的速度。
HALCON提供了更多的图像采集模式,例如,通过外部信号触发采集或从多台相机同时采集图像(现实场景中经常用到)。有兴趣的话可以了解一下。
涉及算子
打开图像采集设备
基础:open_framegrabber
高级:info_framegrabber
设置参数
基础:set_framegrabber_param, get_framegrabber_param
采集图像
基础:read_image, grab_image, grab_image_async
打开图像采集设备
基础:close_framegrabber
进阶
直接访问内存中的外部图像
还可以将外部创建的图像(即计算机内存中的原始图像矩阵)传递给HALCON。
使用操作符gen_image1、gen_image3、gen_image1_extern或gen_image3_extern。
不支持的图像采集设备
如果想使用 HALCON 目前不支持的图像采集设备,也就是说,HALCON不支持的设备,可以创建自己的接口。创建和使用HALCON接口方法可从MVTec的网络服务器下载图像采集接口以及可作为集成基础的模板源代码,网址为http://www.mvtec.com/products/interfaces。