图像采集
1、HALCON 采集接口背后的理念
从用户为机器视觉应用程序开发软件的角度来看,图像的获取只是实际机器视觉任务的前奏。当然,以正确的时间或速率采集图像以及适当配置相机和图像采集卡很重要,但这些任务似乎是基本的,或者至少独立于所使用的图像采集设备。
然而,现实看起来有所不同。图像采集设备在提供的功能上差异很大,即使它们的功能相似,制造商提供的SDK(软件开发工具包)目前还没有遵循任何标准。因此,切换到不同的图像采集设备可能需要重写应用程序的图像采集部分。
HALCON 对这个问题的回答是它的图像采集接口 (IAI),它以动态可加载库的形式提供给当前 50 多个帧采集器和数百个工业相机(模拟、Camera Link、USB 2.0、IEEE 1394 和 GigE)( Windows:DLL;OS X:共享库)。 HALCON 图像采集接口弥补了单个图像采集设备与 HALCON 库之间的差距,该库独立于所使用的图像采集设备、计算机平台和编程语言(见图 1.1)。换句话说,他们
- 以 15 个 HALCON 操作符的形式为 HALCON 用户提供标准化接口,以及
- 封装特定于图像采集卡或相机的细节,即与设备制造商提供的 SDK 的交互。
因此,如果您决定切换到不同的图像采集设备,您只需安装厂商提供的相应驱动程序和SDK,并在调用HALCON算子时使用不同的参数值即可; 运营商本身保持不变。
实际上,图像采集的基本任务由两个 HALCON 算子涵盖:
- open_framegrabber 连接到图像采集设备并设置通用参数,例如,使用的相机类型或相机连接的端口,然后
- grab_image(或grab_image_async)抓取图像。 如果不仅需要抓取单个图像,还需要抓取一组图像或预处理的图像数据(如区域或轮廓),则可以使用grab_data 或grab_data_async
图 1.1:从相机到 HALCON 应用程序
如果图像采集设备提供附加功能,例如图像信号的板载修改、特殊抓取模式或数字输出线,则可通过运算符 set_framegrabber_param 获得(请参阅第 19 页的第 4 部分)。
请注意,对于某些图像采集设备,HALCON 中不提供全部功能;请参阅相应的在线文档,该文档位于 %HALCONROOT%\doc\html\manuals 目录中或通过 Windows 开始菜单中的 HALCON 文件夹(如果您安装了该文档)。最新信息可在 http://www.halcon.com/imageacquisition 下找到。
如果您要使用的图像采集设备(尚)不被 HALCON 支持,您仍然可以将它与 HALCON 一起使用。有关详细信息,请参阅第 40 页上的第 6.2 节。
请注意,在 HALCON 8.0 中,我们的术语发生了变化:由于通过 USB 2.0、IEEE 1394 或 GigE 连接的数码相机并非真正基于实际的图像采集卡板,因此我们不再使用术语 HALCON 图像采集卡接口。相反,我们使用术语 HALCON 采集接口,术语图像采集设备用作图像采集卡或数码相机的替代品。出于向后兼容的原因,HALCON 操作符的名称没有改变,因此,操作符名称 open_framegrabber、info_framegrabber 和 close_framegrabber 可能听起来有点老式。
2、A First Example
在本节中,我们从一个简单的图像采集任务开始,它使用默认配置和标准抓取模式的图像采集设备。 然后对抓取的图像进行分割。 要主动跟随示例,请启动 HDevelop 程序 solution_guide\image_acquisition\ first_example_acquisition.hdev,然后按 Run once 初始化应用程序。
步骤 1:连接到图像采集卡
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', CameraType, myBoard, -1, -1, AcqHandle)
使用操作符 open_framegrabber 打开与图像采集设备的连接时,主要参数是相应 HALCON 采集接口的名称。 因此,您将获得一个所谓的句柄 (AcqHandle),通过它您可以访问图像采集设备,例如,在调用操作者grab_image 时。
图 2.1:a) 获取的图像; b) 处理过的图像(自动分割)
在示例中,大多数其他参数使用默认值(‘default’ 或 -1)
第 2 步:抓取图像
grab_image (Image, AcqHandle)
成功连接到您的图像采集设备后,您可以通过调用带有相应句柄 AcqHandle 的操作符grab_image 来抓取图像。
第 3 步:循环抓取和处理图像
while (Button != 1)
grab_image (Image, AcqHandle)
dev_set_window (WindowHandle)
dev_display (Image)
* -> process image (segment with an automatically determined threshold)
auto_threshold (Image, Regions, 4)
connection (Regions, ConnectedRegions)
dev_set_window (WindowHandleProcess)
dev_display (ConnectedRegions)
* -> check for a click into the window (error handling switched off, otherwise the cursor must always be in the window)
dev_set_check ('~give_error')
get_mposition (WindowHandleButton, Row, Column, Button)
dev_set_check ('give_error')
endwhile
在示例中,然后使用运算符 auto_threshold 自动分割抓取的图像(见图 2.1)。 这是在循环中完成的,可以通过用鼠标左键单击窗口来退出。
3、连接到您的图像采集设备
在本节中,我们将展示如何连接到不同配置的图像采集卡和相机,从一个相机连接到一个图像采集卡的简单情况到更复杂的情况,例如多个同步相机连接到 一块或多块板。
图 3.1:使用 open_framegrabber 的参数描述连接
3.1 打开指定配置的连接
用操作符 open_framegrabber,您可以打开与图像采集设备的连接。这种连接由四个参数描述(见图 3.1): 首先,您选择一个带有参数 Name 的采集接口。参数 Device 指定实际的板卡或相机;根据采集接口,该参数可以包含描述板的字符串或简单的数字(以字符串的形式!)。
通常,相机可以连接到不同端口的图像采集卡,其数量可以通过参数 Port(在极少数情况下为 LineIn)来选择。参数 CameraType 描述了连接的摄像头:对于模拟摄像头,该参数通常指定使用的信号范数,例如,‘ntsc’。对于数码相机,此参数通常指定相机型号;更复杂的采集接口使用此参数来选择相机配置文件。
因此,open_framegrabber 在参数 AcqHandle 中返回打开连接的句柄。请注意,如果您使用 HALCON 的 COM 或 C++ 接口并通过相应的类调用操作符,例如 C++ 中的 HFramegrabber,则不会返回句柄,因为类的实例本身充当您的句柄。
使用 HDevelop 的图像采集助手,您可以轻松连接到您的图像采集设备并选择合适的参数
3.2 连接多个板卡和摄像头
大多数 HALCON 采集接口允许使用多个图像采集卡和相机。 但是,连接摄像机和电路板以及从 HALCON 内部访问这些配置的方法不止一种。 下面,我们描述不同的配置; 请检查您的图像采集设备的 HALCON 接口的在线文档(请参阅 %HALCONROOT%\doc\html\manuals、Windows 开始菜单中的 HALCON 文件夹,或 http://www.halcon.com/image-acquisition) 它支持哪些配置。
3.2.1 单摄像头
图 3.2a 显示了最简单的配置:单个摄像头连接到单个板上,可通过单个手柄访问。 一些图像采集卡,尤其是数字图像采集卡,只支持这种配置; 如以下部分所述,您仍然可以通过将每个摄像头连接到单独的电路板来使用具有此类图像采集卡的多个摄像头。 请注意,此配置是通过 USB 2.0、IEEE 1394 或 GigE 连接的数码相机的典型配置。
3.2.2 Multiple Boards
图 3.2b 显示了具有多个摄像头的配置,每个摄像头都连接到单独的电路板。 在这种情况下,您在 HDevelop 示例程序 solution_guide\image_acquisition\multiple_boards.hdev 中为每个连接调用一次操作符 open_framegrabber。
图 3.2:a) 单板单摄像头; b) 多块板,每块带一个摄像头; c) 带有一个或多个摄像头的多块板; d) 单板多摄像头和端口切换; e) 单板多摄像头同时抓取; f) 使用多个电路板和相机同时抓取
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'default', Board0, -1, -1, AcqHandle0)
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'default', Board1, -1, -1, AcqHandle1)
在此示例中,两个调用仅在参数 Device(“0”和“1”)的值上有所不同; 当然,您也可以为其他参数使用不同的值,甚至可以连接到不同的图像采集接口。
要从两个摄像头抓取图像,您只需使用两次调用 open_framegrabber 返回的两个句柄调用一次操作符grab_image:
grab_image (Image0, AcqHandle0)
grab_image (Image1, AcqHandle1)
3.2.3 每块板有多个手柄
许多图像采集卡提供多个输入端口,因此允许将多个摄像头连接到板上。 根据 HALCON 采集接口的不同,可以通过本节和以下各节中描述的不同方式访问此配置。
连接相机的标准HALCON方法如图3.2c所示:每个连接都有自己的句柄,即open_framegrabber为每个相机调用一次,参数Port的值不同,如HDevelop示例程序solution_guide\image_acquisition\ multiple_ports.hdev:
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'default', Board0, Port0, -1, AcqHandle0)
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'default', Board1, Port1, -1, AcqHandle1)
grab_image (Image0, AcqHandle0) grab_image (Image1, AcqHandle1)
如图 3.2c 所示,您还可以使用多个板卡连接多个摄像头
3.2.4 端口交换
一些图像采集接口不通过多个手柄访问相机,而是通过动态切换输入端口(见图 3.2d)。 因此,open_framegrabber 只被调用一次,就像在 HDevelop 示例程序 solution_guide\image_acquisition\port_switching.hdev 中一样:
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
在抓取图像之间,您使用运算符 set_framegrabber_param 切换端口(有关此运算符的更多信息,请参阅第 20 页上的第 4.2 节):
set_framegrabber_param (AcqHandle, 'port', Port0)
dev_set_window (WindowHandle0)
grab_image (Image0, AcqHandle)
set_framegrabber_param (AcqHandle, 'port', Port1)
dev_set_window (WindowHandle1)
grab_image (Image1, AcqHandle)
请注意,端口切换仅适用于兼容(类似)相机,因为 open_framegrabber 仅被调用一次,即所有相机使用相同的参数值集。 相比之下,当如上所述使用多个手柄时,您可以为各个相机指定不同的参数值(有一些特定于板的限制)。
3.2.5 同时抓取(仅针对特定接口)
在上述配置中,图像是通过多次调用操作者grab_image从单个相机中抓取的。 相比之下,一些采集接口允许通过一次调用grab_image从多个摄像头抓取图像,然后返回多通道图像(参见图3.2e;第51页的附录A.1包含有关多通道图像的更多信息) . 这种模式称为同时抓取(或并行抓取); 与端口切换一样,它仅适用于兼容(类似)的相机。 例如,您可以使用此模式从立体相机系统中抓取同步图像。 请注意,同时抓取仅适用于极少数图像采集接口。
在这种模式下,open_framegrabber 只被调用一次,可以在 HDevelop 示例程序 solution_guide\image_acquisition\simultaneous_grabbing.hdev 中看到:
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
您可以使用运算符 count_channels 检查返回图像(通道)的数量
grab_image (SimulImages, AcqHandle)
count_channels (SimulImages, num_channels)
并根据图像数量提取单个图像,例如使用分解2、分解3等:
if (num_channels == 2)
decompose2 (SimulImages, Image0, Image1)
或者,您可以使用 image_to_channels 将多通道图像转换为图像数组,然后通过 select_obj 选择单个图像。
3.3 请求有关图像采集接口的信息
如前所述,各个 HALCON 采集接口在 HTML 页面上有详细描述,这些页面可以在目录 %HALCONROOT%\doc\html\manuals 或 Windows 开始菜单的 HALCON 文件夹中找到(如果您安装了文档)。 另一种访问图像采集接口信息的方法是使用操作符 info_framegrabber。
在HDevelop示例程序solution_guide\image_acquisition\info_framegrabber.hdev(为HALCON 1394IIDC接口预配置,请根据自己的图像采集设备调整接口名称)多次调用该算子查询接口版本号、可用设备 ,端口号,相机类型,以及open_framegrabber所有参数的默认值; 结果,即 HDevelop 变量窗口中显示的值,如图 3.3 所示。
info_framegrabber (AcqName, 'general', GeneralInfo, GeneralValue)
info_framegrabber (AcqName, 'revision', RevisionInfo, RevisionValue) info_framegrabber (AcqName, 'info_boards', BoardsInfo, BoardsValue) info_framegrabber (AcqName, 'generic', GenericInfo, GenericValue)
info_framegrabber (AcqName, 'camera_type', CamTypeInfo, CamTypeValue) info_framegrabber (AcqName, 'defaults', DefaultsInfo, DefaultsValue)
在使用 open_framegrabber 实际连接到图像采集设备之前,可以调用操作符 info_framegrabber。 唯一的条件是已经安装了HALCON采集接口和设备驱动和SDK。
Figure 3.3: An example result of the operator info_framegrabber.