本章节标题的英文是Image Acquisition,直译是图像采集或图像获取。工业视觉系统中往往使用相机来获取图像,这个过程叫图像采集可能好一些;但是中文版的HDevelop中,是翻译成图像获取的,可能更通用一些。下文有时用图像采集,有时用图像获取,反正大概就是那个意思,希望不要过于纠结。
图像采集对于一个机器视觉系统来讲是至关重要的。在整个项目周期中,它处于早期阶段(通常早于编程)。本节探索在HDevelop中各种图像采集的方式。
在原型设计阶段(prototyping phase),通常会有一组样例图片。HDevelop(确切说是底层的HALCON库)支持多种格式的图片,这些格式的图片可以直接被加载(图像加载详情可查阅参考手册中的 read_image)。
按上节描述读取图像后,图像会自动显示在激活的图形窗口中。这是HDevelop的默认行为,但如果你需要,也可以禁止图像的自动显示,如,为了加快计算密集型程序的速度,有时就需要这么做。
最初,加载的图像会填充满整个图形窗口。因为图形窗口本身并没有调整大小(而图像又强行填充满整个窗口),所以图像的纵横比可能不对。使用图形窗口的工具箱,可以轻松缩放图像,或根据图像改变窗口大小。
一般建议调整窗口大小至图像大小,否则显示会变慢。图像大小、窗口大小和图像的显示部分都可在图形窗口的工具栏进行设置。
加载图像的图标视图(iconic view,有点像缩略图)会显示在变量窗口中。当图形窗口中的图像被清除时,可以通过双击此图标来恢复。
下图是图形窗口的工具栏,
序号标注分别表示:
①清空图形窗口(单击后图形窗口中显示的图像消失)
②选择(选择模式,鼠标左键点击可以选中图像对象)
③移动(移动模式,按住鼠标左键可以移动窗口中的内容)
④放大镜
⑤缩放图片
⑥调整图像大小至窗口大小(图像适应窗口)
⑦调整窗口大小至图像大小(窗口适应图像)
⑧ROI工具(感兴趣区域)
图像采集助手(image acquisition assistant)是一个功能强大的工具,它能通过图像获取接口(image acquisition interface),从HALCON支持的文件(包括AVI文件)、文件夹和图像采集设备中获取图像。要使用图像采集助手,选中 助手>打开新的Image Acquisition 。
此时会打开一个新的窗口(即图像采集助手),显示如下,
该窗口有多个选项卡(tab card),你可以按照选项卡从左往右的顺序依次操作下去。最终,助手会生成HDevelop代码,以插入到当前程序中。选中图像采集助手的菜单中的 帮助 项,可以打开在线帮助文档。
资源(source,其实我觉得翻译成 源 好一点) 选项卡确定采集方法和图像源。默认设置中,图像是从文件中获取的,下一小节会做详细描述。当然,也可以从图像采集设备(如摄像机、采集卡)获取图像。
你可以指定图像加载的图像文件或目录(directory,文件夹/目录)。选中 资源 选项卡中的 图像文件 单选按钮(radio button)。你可以直接在文本框中输入图像名或目录名,多个图像名会以 ; 分隔。通常不需要手动输入文件名或目录名,使用以下按钮操作会更方便:
单击 选择文件 按钮,HDevelop在当前工作目录中打开一个文件选择对话框,里面会显示HALCON支持的图像文件。可以用Ctrl加鼠标点击进行多选。单击 打开 以确认选择。第一个选中的图像会显示在激活的图形窗口中。
单击 选择路径 按钮,HDevelop会打开一个目录浏览器。目前无法选择多个目录。单击 选择文件夹 以确认选择。所选目录的第一个图像会显示在激活的图形窗口中。若勾选了 递归 复选框
,则还会扫描指定目录的所有子目录以查找图像。
上图是与查看图像相关的按钮,序号标注的按钮分别表示:
①连接
②采集(单步执行)
③实时(连续显示)
通过点击 采集 按钮,可以单步浏览所选图像。每点击该按钮,下一张图片就会显示在图形窗口中。也可以点击 实时 按钮循环播放图像,这对动画来讲很有用。这两种功能也可以从菜单上使用。
切换至 代码生成 选项卡,并在 图像对象 文本框中指定变量名。之后,便能在程序中通过该变量名访问图像。若在 资源 选项卡中选择了多个图像或一个文件夹,图像采集助手将循环读取图像,这种情况下,需要指定以下额外变量名:
循环计数(Loop Counter):
循环索引变量的名称。在程序中遍历图像时,该变量将包含当前图像的对象编号。
图像文件:
变量的名称将包含所选图像名称。
点击 代码预览 可以查看当前参数生成的代码。
点击 插入代码 可以生成代码,并将其插入到当前程序IC的位置。
下面代码段是从三个选定图像中生成的示例。它是一个独立的HDevelop程序,运行时无需修改。
* Image Acquisition 03: Code generated by Image Acquisition 03
ImageFiles := []
ImageFiles[0] := 'W/codabar/codabar01.png'
ImageFiles[1] := 'W/codabar/codabar02.png'
ImageFiles[2] := 'W/codabar/codabar03.png'
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
* Image Acquisition 03: Do something
endfor
选中 资源 选项卡中的 图像获取接口 。单选按钮下方的下拉列表会变为激活状态。最初,它会列出所有HALCON支持的图像获取接口。通过点击 自动检测接口 按钮(下图①)可以对该列表进行整理。接着HDevelop会探测本机所有图像获取接口,并移除那些没有响应的接口(其实就是过滤出本机可用的)。探测接口可能会导致系统由于错误安装的驱动程序或硬件故障而挂起。若当前程序中有未保存的更改,HDevelop会弹出警示框,建议保存修改后再继续操作。你也可以忽略警告并继续执行,或中止操作。探测完接口后,可以从列表②中选择所需的图像获取接口。
选中图像采集助手菜单栏中的 帮助 项将打开所选图像获取接口的帮助文档。
图像获取接口由句柄来寻址(获取)。此句柄的变量名可在 连接句柄(Connection Handle) 的文本框中指定。获取图像的变量名在 图像对象(Image Object) 中指定。
单击 代码预览 以查看生成的代码。单击 插入代码 以生成代码,插入至程序窗口的IC处。
下面是一份示例代码:
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] ', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
endwhile
close_framegrabber (AcqHandle)
生成的代码插入到程序窗口后,HDevelop在内部会将代码链接至相应的助手。该链接会一直保持,直到使用菜单项 文件>退出助手 来退出助手。若使用菜单项 文件>关闭对话框 或使用窗口的关闭图标来关闭助手,该助手可从菜单 助手 的顶部恢复。
你可以更改助手中的设置并相应地更新生成的代码。代码预览会显示生成的代码行将如何更新。此外,你可以删除生成的代码行,或释放它们。当代码行被释放时,助手与这些行之间的内部链接会被切断。之后,同一助手可以在当前程序的不同位置生成额外的代码。
回顾一下,本节主要介绍了用HDevelop采集图像: