2. 图像采集

图像采集:从相机实时获取图像 学习卡片

任务边界与实现路径

本案例使用 HALCON 的 Image Acquisition 接口(open_framegrabber / grab_image_async)连接一台工业相机,完成连续实时采集与窗口显示。核心闭环为:打开采集接口 → 循环异步抓取 → 显示 → 关闭接口。下面给出可直接运行的 HDevelop 代码,并说明参数含义与验证方法。

关键对象与参数

对象/参数含义示例取值
AcqName采集接口名(对应相机厂商驱动)'GigEVision2'、'DirectShow'、'File'
HorizontalResolution / VerticalResolution图像宽/高1280 / 1024
ImageWidth / ImageHeight期望输出图像尺寸1280 / 1024
StartRow/Column, EndRow/ColumnROI 区域0,0,1023,1279
Field半帧选择(隔行相机)'progressive'
BitsPerChannel位深8
ColorSpace颜色空间'gray' 或 'rgb'
Generic厂商通用参数串'-1' 表示默认
ExternalTrigger外触发'false'(自由运行)
CameraType相机类型'default'
Device设备标识'default' 或相机序列号
Port端口0
LineIn触发输入线-1

完整可运行代码(HDevelop)

* 图像采集:从相机实时获取图像
* 1) 打开采集接口
AcqName := 'GigEVision2'      * 按实际相机驱动替换,如 'DirectShow'、'File'
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'default', 0, -1, AcqHandle)

* 2) 读取接口信息,确认连接成功
get_framegrabber_param (AcqHandle, 'width', Width)
get_framegrabber_param (AcqHandle, 'height', Height)
get_framegrabber_param (AcqHandle, 'name', CameraName)

* 3) 打开显示窗口
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_window (WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_update_window ('off')

* 4) 实时采集循环
NumFrames := 100            * 采集帧数,实际工程可改为 while(true)
for Index := 1 to NumFrames by 1
    * 异步抓取:先取上一帧,再启动下一帧,降低等待
    grab_image_async (Image, AcqHandle, -1)
    dev_display (Image)
    * 可选:显示帧号
    disp_message (WindowHandle, 'Frame: ' + Index, 'window', 12, 12, 'black', 'true')
endfor

* 5) 关闭采集接口,释放资源
close_framegrabber (AcqHandle)
dev_update_window ('on')

关键动作说明

  • open_framegrabber 的第 2、3 个参数为图像宽高缩放因子,示例用 1,1 表示不缩放;ROI 用 0,0,0,0 表示全幅。
  • grab_image_async 的第三个参数为超时(毫秒),-1 表示无限等待。异步模式在采集下一帧的同时处理当前帧,适合实时显示。
  • 若相机为彩色,将 ColorSpace 设为 'rgb',此时 Image 为三通道图像,dev_display 可直接显示。
  • 若使用外触发,将 ExternalTrigger 设为 'true',并通过 set_framegrabber_param 配置触发源。

验证方法与通过条件

  1. 运行后窗口应持续刷新画面,帧号递增,无卡死或报错。
  2. 调用 get_framegrabber_param 返回的 Width/Height 应与相机实际分辨率一致。
  3. 采集 100 帧后正常执行 close_framegrabber,无资源泄漏提示。
  4. 若报错 H_ERR_FG 类错误,检查 AcqName 是否与已安装驱动匹配、相机是否被其他程序占用。

常见问题

  • 无图像/黑屏:确认相机供电与网线连接,GigE 相机需在同一网段;用厂商工具先验证相机可出图。
  • 帧率低:检查是否误用同步 grab_image;改用 grab_image_async 并关闭 dev_update_window。
  • 接口名不确定:在 HDevelop 中执行 info_framegrabber 可列出当前系统可用的采集接口。