机器视觉技术基础
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 软件图像采集

熟悉了HALCON界面之后,接下来就要考虑怎么样进行图像采集。图像采集是图像处理的基础,采集图像的速度和质量会直接影响后续图像处理的效率。本章主要介绍如何获取输入图像。

3.3.1 获取非实时图像

当不能在检测现场进行实时调试时,我们可以选择拍摄好的一些图像或者视频作为测试素材,进行算法测试与处理。

①利用read_image算子读取图像,程序如下:

     read_image (Image, 'D:/patras.png')

以上程序可读取单张指定位置图像,若要读取整个文件夹的图像,则可以利用for循环来实现,代码如下:

    *列出指定路径下的文件
    list_files ('D:/picture', ['files','follow_links'], ImageFiles)
    *选择符合条件的文件
    tuple_regexp_select(ImageFiles,['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm
|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
    *循环读取文件夹中的文件
    for Index := 0 to |ImageFiles| - 1 by 1
           read_image (Image, ImageFiles[Index])
    endfor

②利用快捷键。

按住Ctrl+R打开读取图像对话窗口,在文件名称一栏中选择图像所在的文件路径,在语句插入位置点击确定,即可获得图像,如图3.18所示。

图3.18 使用快捷键获取图像

③利用采集助手批量读取文件夹下所有图像。

利用采集助手批量读取文件夹下所有图像的步骤为:点击菜单栏中的“助手”→“打开新的Image Acquisition”,点击“资源”选项卡下的“选择路径”,如图3.19所示。点击“代码生成”选项卡下的“插入代码”,如图3.20所示。

图3.19 文件选择路径

图3.20 插入代码

④读取视频文件。

读取视频文件与读取图像文件类似,以HALCON图像采集助手为例:

点击菜单栏中的“助手”→“打开新的Image Acquisition”,点击“资源”选项卡下的“图像获取接口”,选项区域选择“DirectFile”,如图3.19所示,然后选择“连接”选项卡,在其中设置读取视频的参数,在“媒体文件”中选择视频所在的路径,如图3.21所示,即可实现视频的输入。

图3.21 选择媒体文件

实现代码参考如下:

    *开启图像采集接口
    open_framegrabber ('DirectFile', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1,
'false', 'D:/video.avi', 'default', -1, -1, AcqHandle)
    *开始异步采集
    grab_image_start (AcqHandle, -1)
    while (true)
           *获取采集的像
           grab_image_async (Image, AcqHandle, -1)
    endwhile
    close_framegrabber (AcqHandle)

HALCON支持的视频格式并不多,文件中可选的只有“.avi”格式的视频,而且并非所有“.avi”格式的文件都能提取。因此建议使用图像或者图像序列的方式来代替非实时视频输入。

3.3.2 获取实时图像

实时图像采集是利用现代化技术进行实时图像信息获取的手段,在现代多媒体技术中占有重要的地位。在日常生活中、生物医学领域、航空航天等领域都有着广泛的应用。图像采集的速度、质量直接影响到产品的整体效果。在HALCON中,获取实时图像主要有两种方式:①通过HALCON自带的采集接口获取;②通过相机配套的SDK获取。本节主要介绍第一种方式。

HALCON的采集功能非常强大,它支持的相机种类非常丰富,为市面上常见的多种机型提供了统一的公用接口。如果系统选择的相机支持HALCON,就可以直接使用HALCON自带的接口库实现连接。

HALCON实时图像采集可分为三步,如图3.22所示。

图3.22 HALCON实时采集图像流程

(1)连接相机

在HALCON中,调用open_framegrabber算子可以连接相机,同时设置一些基本的采集参数,如选择相机类型和指定采集设备。也可以设置和图像相关的参数,介绍如下。

①HorizontalResolution:图像采集接口的水平相对分辨率。如果是1,表示采集的图宽度和原图一样大;如果是2,表示采集图的宽度为原图的两倍。默认为1。

②VerticalResolution:图像采集接口的垂直相对分辨率。同样,默认为1,表示采集的图宽度和原图一样大。

③ImageWidth:图像的宽,即每行的像素数。默认为0,表示原始图的宽度。

④ImageHeight:图像的高,即每列的像素数。默认为0,表示原始图的高度。

⑤StartRow、StartColumn:采集图像在原始图像上的起始坐标,均默认为0。

⑥Field:相机的类型,默认为default。

⑦BitsPerChannel:像素的位数,默认为-1。

⑧ColorSpace:颜色空间,默认为default,也可以选择Gray或RGB,分别表示灰度和彩色。

⑨Generic:通用参数与设备细节部分的具体意义,默认为-1。

⑩CameraType:相机的类型,默认为default,也可以根据相机的类型选择ntsc、pal或auto。

⑪Device:HALCON所连接的采集设备的编号,默认为default,如果不确定相机的编号,可使用info_framegrabber算子进行查询。

⑫Port:图像获取识别连接的端口,默认为-1。

这个算子执行完后会返回一个图像采集的连接句柄AcqHandle,该句柄就如同HALCON和硬件进行交互的一个接口。使用该句柄可以实现图像捕获、设置采集参数等。

(2)设置采集参数

open_framegrabber算子是针对大部分相机的公用接口,但相机的种类繁多,功能各异,因此公用接口中只包含了通用的几种简单操作的参数。如果想要充分地利用相机的全部功能,则可以使用set_framegrabber_param设置其他的特殊参数。

具体的参数种类或值的含义可参考HALCON的算子文档,如果想要查看HALCON具体支持哪些可修改的参数,可以使用info_framegrabber算子。例如:

     info_framegrabber('GigEVision','parameters',ParametersInfo,ParametersValue)

特殊参数将在“变量监视”窗口列出,如图3.23所示。

图3.23 特殊参数列表

如要修改其中的某项参数,使用set_framegrabber_param算子。例如:

     set_framegrabber_param (::AcqHandle, Param,Value: )

其中AcqHandle为图像采集的句柄,Param为参数名称,Value为要修改的值。选项可参考如下:

AcqHandle:(输入参数)图像采集设备句柄。

Param:(输入参数)参数名称,可以设置'color_space'(颜色空间), 'continuous_grabbing'(连续获取图像), 'external_trigger'(外部获取触发器)等。

Value:(输入参数)要修改的参数值。

值得注意的是,如果某个参数在open_framegrabber中设定过,那么该参数将不可在相机工作过程中被修改。如果要查询某一个参数的值,可以用get_framegrabber_param算子。例如:

     get_framegrabber_param (AcqHandle, 'name', Value)
(3)采集图像

与相机建立联系后,可以调用grab_image或grab_image_async算子进行图像采集。

①grab_image用于相机的同步采集,具体算子如下:

     grab_image( : Image : AcqHandle : )

其工作流程是先获取图像,然后在图像转换等处理流程完成之后再获取下一帧图像,图像的获取和处理是两个顺序执行的环节。因此,下一帧图像的获取要等待上一帧图像的处理完成才开始,这样采集图像的速率会受处理速度的影响。

②grab_image_async用于相机的异步采集,具体算子如下:

     grab_image_async( : Image : AcqHandle, MaxDelay : )

其中MaxDelay表示异步采集时可以允许的最大延时,异步采集不需要等到上一帧图片处理完成再开始捕获下一帧,图像的获取和处理是两个独立的环节。

(4)关闭图像采集接口

采集完图像后可用close_framegrabber关闭图像采集设备。

例3.1

采集图像实例。

    *打开海康威视相机
    open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', 8, 'gray', -1,
'false', 'default', 'c42f90f25dbe_Hikvision_MVCA05010GM', 0, -1, AcqHandle)
    *准备采集图像
    grab_image_start (AcqHandle, -1)
    *循环采集图像
    while (true)
           grab_image_async (Image, AcqHandle, -1)
    Endwhile
    *关闭相机
    close_framegrabber (AcqHandle)