3. 图像采集与读取
在Halcon 2D视觉对位贴合系统中,图像采集与读取是所有后续处理流程的起点。图像数据的质量、获取速度以及格式规范,直接决定了定位算法的精度上限与系统的整体节拍。本章将系统讲解Halcon中图像采集的完整链路,涵盖相机接口选型、图像文件读取方法、实时图像获取机制,以及分辨率与格式对视觉系统的影响。理解这些基础概念,是构建稳定、高效视觉系统的前提。
上图展示了Halcon图像采集的整体架构。从底层硬件接口到上层图像数据对象,每一层都有明确的职责划分。硬件接口层决定了数据传输的物理方式,采集驱动层负责将硬件数据转换为Halcon可识别的图像对象,而文件读取层则提供了离线开发与调试的便捷途径。实时获取流程则体现了Halcon在工业场景中高效处理图像流的典型模式。
3.1 相机接口选型与Halcon配置
核心原理:不同接口的适用场景
工业相机接口决定了数据传输带宽、线缆长度、供电方式以及多相机同步能力。在2D对位贴合系统中,常见的接口包括GigE Vision、USB3 Vision、Camera Link和CoaXPress。GigE Vision基于千兆以太网,线缆长度可达100米,易于组网,但CPU占用相对较高;USB3 Vision带宽高(理论5Gbps),即插即用,适合短距离桌面级应用;Camera Link提供极高的带宽和确定性传输,但需要专用采集卡,成本较高;CoaXPress则支持更长距离和更高带宽,适用于高速高分辨率场景。
| 接口类型 | 带宽 | 最大线缆长度 | CPU占用 | 适用场景 |
|---|---|---|---|---|
| GigE Vision | 1 Gbps | 100 m | 中 | 分布式系统、多相机 |
| USB3 Vision | 5 Gbps | 3-5 m | 低 | 桌面级、单相机 |
| Camera Link | 2.38-6.8 Gbps | 10 m | 低 | 高速线阵、高分辨率 |
| CoaXPress | 6.25-12.5 Gbps | 100 m+ | 低 | 超高速、远距离 |
操作流程:Halcon中配置相机
在Halcon中,使用open_framegrabber算子初始化相机连接。该算子需要指定接口类型、设备ID、相机参数等。以下是一个典型的GigE相机配置示例:
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'cam_0', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
grab_image_async (Image, AcqHandle, -1)
* 在此处执行图像处理
endwhile
close_framegrabber (AcqHandle)
参数说明:'GigEVision'指定接口类型;'cam_0'是相机设备名;AcqHandle是采集句柄。对于USB3相机,将接口类型改为'USB3Vision'即可。
info_framegrabber算子查询可用设备列表,避免因设备名错误导致连接失败。同时,建议设置相机参数(如曝光时间、增益)时使用set_framegrabber_param,并确保参数值在相机支持范围内。
案例拆解:多相机同步采集
在对位贴合系统中,常需要多个相机从不同角度拍摄同一目标。假设使用两台GigE相机,要求同步触发。首先,通过硬件触发线将相机连接至PLC或运动控制卡,确保外部触发信号同时到达两台相机。在Halcon中,分别打开两个采集句柄,并设置触发模式为外部触发:
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'cam_0', 0, -1, AcqHandle1)
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'cam_1', 0, -1, AcqHandle2)
set_framegrabber_param (AcqHandle1, 'trigger_mode', 'on')
set_framegrabber_param (AcqHandle2, 'trigger_mode', 'on')
grab_image_start (AcqHandle1, -1)
grab_image_start (AcqHandle2, -1)
while (true)
grab_image_async (Image1, AcqHandle1, -1)
grab_image_async (Image2, AcqHandle2, -1)
* 两幅图像时间戳接近,可进行联合处理
endwhile
此方案的关键在于硬件触发信号的同步性。若使用软件触发,两台相机的采集时刻可能存在微小偏差,导致运动中的目标位置不一致。
常见误区与复盘
- 误区一:忽略网络配置。GigE相机要求网卡支持巨型帧(Jumbo Frame),且IP地址与相机在同一网段。未配置时会出现丢帧或无法连接。
- 误区二:未设置相机参数导致图像过暗或过曝。应在采集前通过
set_framegrabber_param设置曝光、增益、白平衡等参数。 - 复盘:在项目调试初期,建议先使用Halcon的
grab_image同步采集单帧,验证相机连接和图像质量,再切换到异步采集模式。
3.2 图像文件读取与格式转换
核心原理:文件读取的底层机制
Halcon支持多种图像文件格式,包括BMP、JPEG、PNG、TIFF以及Halcon专有的HOBJ格式。读取文件时,Halcon根据文件扩展名自动识别格式,并将数据解码为HObject图像对象。对于彩色图像,Halcon默认将其转换为RGB三通道;对于灰度图像,则转换为单通道。理解格式的差异有助于选择合适的存储方式:BMP无损但体积大,JPEG有损但体积小,PNG支持无损压缩和透明度,TIFF支持多页和多光谱。
操作流程:读取与保存图像
* 读取图像文件
read_image (Image, 'C:/images/part_01.png')
* 获取图像尺寸
get_image_size (Image, Width, Height)
* 获取图像通道数
count_channels (Image, Channels)
* 保存图像为不同格式
write_image (Image, 'jpeg', 95, 'C:/output/part_01.jpg')
write_image (Image, 'png', 0, 'C:/output/part_01.png')
在批量处理场景中,可使用list_files算子遍历文件夹内所有图像文件,结合循环实现自动化处理。
案例拆解:离线图像库验证算法
在开发对位贴合算法时,通常先使用离线图像库验证算法可行性。假设收集了100张不同光照条件下的产品图像,存放在./samples目录下。通过以下代码批量读取并测试定位算法:
list_files ('./samples', 'files', ImageFiles)
for i := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[i])
* 执行模板匹配或对位算法
find_shape_model (Image, ModelID, Row, Column, Angle, Score)
* 记录结果
endfor
此流程可快速评估算法在不同样本上的鲁棒性,并发现光照变化、遮挡等异常情况。
常见误区与总结
- 误区:直接读取图像后未检查通道数,导致后续灰度处理算子报错。应使用
count_channels确认,必要时用rgb1_to_gray转换。 - 误区:忽略图像方向。部分相机或文件保存时图像可能旋转,需在读取后使用
rotate_image校正。 - 总结:文件读取是离线开发的基础,掌握格式转换和批量处理技巧能显著提升调试效率。
3.3 实时图像获取与异步采集
核心原理:同步与异步模式
Halcon提供两种实时采集模式:同步模式(grab_image)和异步模式(grab_image_start + grab_image_async)。同步模式在采集时阻塞程序,直到图像数据完全传输完毕才返回,适合低速或单帧采集。异步模式则先启动采集,程序可继续执行其他任务,当需要图像时再获取最新帧,适合高速连续采集场景,能有效降低CPU等待时间。
操作流程:异步采集的典型循环
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'cam_0', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
* 获取最新图像
grab_image_async (Image, AcqHandle, -1)
* 执行对位处理
find_shape_model (Image, ModelID, Row, Column, Angle, Score)
* 将结果发送至运动控制
set_origin (Pose, Row, Column, Angle)
endwhile
在异步模式下,grab_image_async的第三个参数Timeout可设置等待超时时间(毫秒),避免无限阻塞。
grab_image_async的队列机制,或适当降低采集帧率。
案例拆解:高速贴装中的实时对位
在高速贴片机中,相机以200帧/秒的速度采集运动中的元件图像。系统要求每次对位处理时间不超过5毫秒。采用异步采集模式,主循环中先启动采集,然后执行上一帧的对位计算,最后获取最新帧。通过合理分配CPU时间,实现了连续稳定运行。若使用同步模式,则每帧需等待采集完成,处理时间被拉长,无法满足节拍要求。
常见误区与复盘
- 误区:在异步循环中忘记调用
grab_image_start,导致grab_image_async报错。 - 误区:未处理超时情况。当相机掉线或触发信号丢失时,
grab_image_async会返回超时错误,需在代码中加入异常处理。 - 复盘:实时采集的稳定性依赖于硬件触发、网络带宽和CPU负载的协同。建议在项目初期进行压力测试,确定系统的最大可持续帧率。
3.4 图像分辨率与格式对视觉系统的影响
核心原理:分辨率与精度的关系
图像分辨率(宽×高像素数)决定了视觉系统的物理测量精度。例如,视野为10mm×10mm,图像分辨率为1000×1000像素,则每个像素对应的物理尺寸为0.01mm。在2D对位贴合中,通常要求定位精度为像素尺寸的1/10到1/5,因此分辨率越高,理论精度越高。但高分辨率也带来更大的数据量和更长的处理时间,需在精度与速度之间权衡。
图像格式与位深
Halcon支持多种图像格式,包括byte(8位灰度)、uint2(16位灰度)、int1、real等。位深决定了灰度级数,8位提供256级灰度,16位提供65536级。对于高动态范围场景,16位图像能保留更多细节,但处理速度较慢。彩色图像通常为RGB三通道,每个通道8位或16位。
| 格式 | 位深 | 通道数 | 适用场景 |
|---|---|---|---|
| byte | 8 | 1 | 标准灰度图像 |
| uint2 | 16 | 1 | 高动态范围、医学影像 |
| rgb | 8/通道 | 3 | 彩色图像、颜色识别 |
| real | 32 | 1 | 浮点运算、深度图 |
操作流程:分辨率与格式的转换
* 缩放图像分辨率
zoom_image_factor (Image, ZoomedImage, 0.5, 0.5, 'constant')
* 转换灰度格式
rgb1_to_gray (Image, GrayImage)
* 转换位深
change_domain (Image, Domain, ImageReduced)
convert_image_type (Image, ConvertedImage, 'uint2')
在Halcon中,zoom_image_factor可快速缩放图像,但会引入插值误差。对于测量任务,建议保持原始分辨率,仅在预处理阶段使用缩放加速。
find_shape_model的SubPixel参数)来突破物理分辨率限制,而不是盲目提高相机分辨率,因为高分辨率相机会显著增加成本和处理负担。
案例拆解:分辨率选择实战
某项目需检测0.5mm宽度的Mark点,定位精度要求±0.02mm。若视野为20mm×20mm,则所需像素数为:20mm / 0.02mm = 1000像素。考虑亚像素精度(1/5像素),实际分辨率需达到5000×5000像素。此时选择500万像素相机(2448×2048)无法满足要求,需选用1200万像素相机(4000×3000)或缩小视野。通过计算,最终选用1200万像素相机,视野缩小至15mm×15mm,满足精度要求。
常见误区与总结
- 误区:盲目追求高分辨率,忽略处理速度和存储成本。
- 误区:未考虑镜头畸变对分辨率的影响。高分辨率相机配合低质量镜头,边缘区域可能模糊,导致定位精度下降。
- 总结:分辨率选择应基于精度需求、视野大小、处理速度和成本综合评估。格式选择则需权衡动态范围与处理效率。
本章系统梳理了Halcon图像采集与读取的完整知识体系。从相机接口的物理层选型,到文件读取的离线开发,再到实时异步采集的工程实践,以及分辨率与格式的权衡决策,每一个环节都直接影响视觉对位系统的最终性能。在实际项目中,建议先通过离线图像库验证算法,再逐步过渡到实时采集,最后根据节拍要求优化采集与处理流程,确保系统稳定、高效运行。