当前位置:AIGC资讯 > 数据采集 > 正文

Halcon之图像采集

文章目录

1、HALCON 图像采集 1.1 基本概念 1.1.1 打开图像采集设备 1.1.2 获取图像 1.1.3 关闭图像采集设备 1.1.4 A First Example 1.2 扩展概念 1.2.1 打开图像采集设备 1.2.2 设置参数 1.2.3 获取图像 1.3 编程示例 1.4 选择算子 1.4.1 打开图像采集设备 1.4.2 设置参数 1.4.3 获取图像 1.4.4 关闭图像采集设备 1.5 Tips & Tricks 1.5.1 直接访问内存中的外部图像 1.5.2 不支持的图像采集设备

1、HALCON 图像采集

显然,图像的获取是所有机器视觉应用中必须解决的任务。不幸的是,这项任务主要包括与图像采集设备形式的特殊非标准化硬件进行交互,例如图像采集卡或 IEEE 1394 相机。为了让您专注于实际的机器视觉问题,HALCON 为您提供了为大量图像采集设备执行这种交互的接口(有关最新信息,请参见 http://www.mvtec.com/halcon/framegrabber)。

在您的 HALCON 应用程序中,图像采集任务因此减少到几行代码,即几个操作员调用。更重要的是,这种简单性并不是以限制可用功能为代价来实现的:使用 HALCON,您可以在不同的定时模式下从各种配置的采集设备和相机中获取图像。
除了从相机获取图像外,HALCON 还允许您输入存储在文件中的图像(支持的格式:BMP、TIFF、GIF、JPEG、PNG、PNM、PCX、XWD)。当然,您也可以将获取的图像存储在文件中。

1.1 基本概念

使用 HALCON 获取图像基本上包括三个步骤。 从文件中读取图像甚至更简单:它由对操作符 read_image 的单个调用组成。

1.1.1 打开图像采集设备

如果您想从图像采集卡或 IEEE 1394 相机等图像采集设备获取图像,第一步是连接到该设备。 HALCON 使您免于所有特定于设备的详细信息;您需要做的就是调用操作符 open_framegrabber,指定相应图像采集接口的名称。
还有一个名为 File 的“虚拟”图像采集接口。顾名思义,这个“帧抓取器”从文件中读取图像,也从所谓的图像序列文件中读取图像。后者是特定于 HALCON 的文件,通常带有扩展名 .seq;它们包含一个由新行分隔的图像文件名列表(您可以使用文本编辑器轻松创建它)。如果您连接到这样的序列,随后对grab_image 的调用将返回文件中指定序列中的图像。或者,您也可以从特定目录读取所有图像。然后,您不必创建序列文件,而只需指定目录名称而不是序列文件作为参数“CameraType”的值。现在,对grab_image 的后续调用将返回在指定图像目录中找到的图像。如果您想用一系列图像文件测试您的应用程序,然后切换到真实的图像采集设备,这两种方法都很有用。

1.1.2 获取图像

连接到设备后,您只需调用grab_image 即可获取图像。
要从磁盘加载图像,请使用 read_image。 在当前目录和环境变量 HALCONIMAGES 中指定的目录中搜索图像。

1.1.3 关闭图像采集设备

在应用程序结束时,您关闭与图像采集设备的连接以使用操作符 close_framegrabber 释放其资源。

1.1.4 A First Example

如前所述,从文件中获取图像对应于单个操作员调用:

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)
... process image ...
ImageNum := ImageNum + 1
endwhile

1.2 扩展概念

在实际应用中,通常告诉相机获取图像是不够的; 相反,以正确的时刻或速率采集图像以及适当配置相机和图像采集接口可能很重要。 因此,HALCON 允许进一步参数化采集过程。 在 HDevelop 中,通过菜单项 Assistants > Image Acquisition 提供了一个助手,它可以帮助您选择图像源、调整参数和生成合适的代码。

1.2.1 打开图像采集设备

使用open_framegrabber连接你的图像采集设备时,主要参数是对应的HALCON图像采集接口的名称。因此,您将获得一个所谓的句柄,您可以稍后使用该句柄访问设备,例如,使用grab_image 或grab_image_async 获取图像。
使用 open_framegrabber 的其他参数,您可以描述图像采集设备和摄像头的配置,这在使用更复杂的配置时是必要的,例如,多个摄像头连接到不同帧采集卡上的不同端口。更多参数允许您指定所需的图像格式(大小、分辨率、像素类型、色彩空间)。对于大多数这些参数,如果您指定值“default”(字符串参数)或 -1(数字参数),则会使用默认值。
使用操作符 info_framegrabber,您可以查询接口版本号或可用板卡、端口号和相机类型等信息。
有关 open_framegrabber 参数的详细信息可以在解决方案指南 II-A 中找到(配置连接:第 11 页的第 3 部分;配置获取的图像:第 19 页的第 4 部分)。

1.2.2 设置参数

如上所述,您已经在使用 open_framegrabber 连接到图像采集设备时设置了参数。 这些参数(image_acquisition device(s)/camera(s)的配置和图像尺寸等)就是所谓的通用参数,因为它们几乎是所有图像采集接口的通用参数。 然而,图像采集设备在提供的功能方面差异很大,导致更多的特殊参数。 可以使用运算符 set_framegrabber_param 自定义这些参数。
使用运算符 get_framegrabber_param 您可以查询常用和特殊参数的当前值。
有关设置参数的详细信息,请参见第 19 页第 4 部分的解决方案指南 II-A。

1.2.3 获取图像

实际上,在典型的机器视觉应用中,您不会使用操作符grab_image 来获取图像,而是使用grab_image_async。 这两个操作符之间的区别如下: 如果在循环中获取和处理图像,grab_image 总是请求获取新图像,然后阻塞程序,直到获取完成。 然后,图像被处理,之后,程序等待下一个图像。 相比之下,使用grab_image_async 时,图像是并行采集和处理的:在处理图像时,已经在采集下一幅图像。 当然,这会导致应用程序的显着加速。
HALCON 提供了更多的图像采集模式,例如,通过外部信号触发采集或从多个相机同时采集图像。 有关各种图像采集模式的详细信息,请参见第 25 页第 5 部分的解决方案指南 II-A。

1.3 编程示例

可以在目录 %HAL- 中找到所有提供的图像采集接口的示例程序
CONEXAMPLES%\hdevelop\Image\Acquisition。 解决方案指南 II-A 中描述了更多示例。

1.4 选择算子

1.4.1 打开图像采集设备

Standard: 
open_framegrabber
Advanced:
info_framegrabber

1.4.2 设置参数

Standard:
set_framegrabber_param, get_framegrabber_param

1.4.3 获取图像

Standard:
read_image, grab_image, grab_image_async

1.4.4 关闭图像采集设备

Standard:
close_framegrabber

1.5 Tips & Tricks

1.5.1 直接访问内存中的外部图像

您还可以使用运算符 gen_image1、gen_image3、gen_image1_extern 或 gen_image3_extern 将外部创建的图像(即计算机内存中的原始图像矩阵)传递给 HALCON。 有关示例,请参阅解决方案指南 II-A,第 40 页上的第 6.2 节。

1.5.2 不支持的图像采集设备

如果您想使用HALCON目前不支持的图像采集设备,即不存在HALCON图像采集接口,您可以创建自己的接口; Image Acquisition Interface Programmer’s Manual 中详细描述了如何执行此操作。

更新时间 2023-11-08