2. 机器视觉基础

在进入HALCON形状匹配与VC++联合开发之前,必须先建立统一的视觉语言。形状匹配的本质是在数字图像中寻找已知几何特征的过程,而这一过程完全建立在图像采集、像素空间、灰度分布和边缘轮廓这四个基础支柱之上。如果这些概念理解不透彻,后续的模板创建、匹配参数调优和坐标转换都会变成盲目的试错。本章将系统梳理从物理世界到数字图像的映射链路,并重点剖析HALCON中图像坐标系与像素坐标系的关系,为后续基于VC++的定位程序开发打下坚实的理论地基。

机器视觉基础概念链路图 图像采集 相机/镜头/光源 像素与坐标系 行列坐标/世界坐标 灰度与二值化 0-255/阈值分割 边缘与轮廓 梯度/亚像素 像素坐标系 (Row, Col) (0,0) Col → Row ↓ 灰度直方图 0 255 边缘提取 亚像素轮廓 HALCON形状匹配处理链路 1. 图像采集 2. 预处理(灰度化) 3. 阈值分割 4. 边缘提取 5. 轮廓拟合 6. 模板匹配 坐标系转换:像素坐标 → 世界坐标 → 机器人坐标

2.1 图像采集:从物理世界到数字图像的映射

图像采集是机器视觉系统的第一环,其质量直接决定了后续所有算法的上限。在HALCON开发中,我们通常通过GigE Vision、USB3 Vision或Camera Link接口获取图像。工业相机输出的原始数据是RAW格式,经过ISP(图像信号处理器)处理后转换为Bayer格式或RGB格式,最终在HALCON中通过grab_image或grab_image_async算子采集为HObject类型的图像对象。

采集过程中需要关注三个核心参数:曝光时间、增益和光圈。曝光时间控制进光量,增益放大电信号,光圈调节镜头通光口径。在高速运动场景下,曝光时间过短会导致图像过暗,过长则产生运动模糊。HALCON中可以通过set_framegrabber_param设置相机参数,例如:

open_framegrabber('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'Camera1', 0, -1, AcqHandle)
set_framegrabber_param(AcqHandle, 'ExposureTime', 5000)  // 单位微秒
set_framegrabber_param(AcqHandle, 'Gain', 12.0)

采集环节的常见误区是忽视光源设计。对于形状匹配而言,均匀漫射光通常优于点光源,因为前者能减少镜面反射造成的灰度饱和。在VC++集成开发中,建议将相机参数配置写入XML配置文件,避免硬编码。

经验提醒:在HALCON中,grab_image_async配合set_framegrabber_param('grab_timeout', 5000)可以避免采集超时导致的程序挂死。对于高速产线,建议使用双缓冲或多缓冲机制,确保图像采集与处理并行。

2.2 像素与坐标系:理解行列与物理世界的转换

数字图像由像素矩阵构成,HALCON中图像坐标系以左上角为原点,Row表示行坐标(向下增加),Column表示列坐标(向右增加)。这与数学中常见的笛卡尔坐标系不同,初学者容易混淆。在形状匹配中,模板创建时记录的是像素坐标,而最终输出给机器人或PLC的必须是世界坐标(毫米或度)。

坐标转换涉及三个层次:像素坐标(图像中的行列位置)、图像坐标(以图像中心为原点的物理坐标,单位mm)、世界坐标(相机坐标系或机器人坐标系)。HALCON提供calibrate_cameras和camera_calibration算子完成标定,核心是计算内参(焦距、主点、畸变系数)和外参(旋转矩阵、平移向量)。

坐标系原点位置单位典型应用
像素坐标 (Row, Col)图像左上角像素 (pixel)模板匹配、ROI定义
图像坐标 (X, Y)图像中心毫米 (mm)测量、尺寸检测
世界坐标 (Xw, Yw, Zw)相机/机器人基座毫米/度机器人引导、定位

在VC++开发中,坐标转换通常封装为独立的类,例如CCoordinateTransform,内部维护标定矩阵。一个典型的转换流程是:先通过find_shape_model获得模板在图像中的像素坐标(Row, Col, Angle),再调用image_points_to_world_plane转换为世界坐标。

风险提示:如果相机安装角度与运动平面不平行,必须进行透视校正。否则,图像边缘的定位误差可能达到数毫米。建议在标定时使用至少9个点的标定板,并检查重投影误差是否小于0.1像素。

2.3 灰度与二值化:从连续灰度到离散区域的转换

灰度图像每个像素的取值范围为0~255,0表示纯黑,255表示纯白。二值化是将灰度图像转换为只有0和255两个值的图像,目的是分离目标与背景。HALCON中threshold算子是最基础的二值化方法,其原理是选取一个阈值T,将灰度值大于T的像素设为255,小于等于T的设为0。

实际应用中,全局阈值往往无法应对光照不均的情况。此时需要采用局部自适应阈值,HALCON提供dyn_threshold算子,它通过比较原图与平滑后的背景图来动态确定阈值。对于形状匹配而言,二值化并非必须步骤,因为HALCON的形状匹配算法直接基于灰度梯度工作,但二值化常用于预处理和ROI提取。

// 全局阈值
threshold(Image, Region, 128, 255)
// 动态阈值
mean_image(Image, ImageMean, 21, 21)
dyn_threshold(Image, ImageMean, RegionDyn, 15, 'dark')

二值化后的区域可能存在噪点和孔洞,常用connection分割连通域,select_shape按面积、宽度等特征筛选目标区域。在VC++集成时,建议将阈值参数暴露为界面可调项,方便现场调试。

实战场景:在PCB板定位项目中,由于铜箔反光导致灰度分布不均,全局阈值无法稳定分割。我们采用dyn_threshold配合高斯平滑(σ=3),成功将定位精度从±0.5mm提升到±0.15mm。关键参数是平滑核大小,过小则噪声放大,过大则丢失细节。

2.4 边缘与轮廓:形状匹配的核心特征

边缘是图像中灰度发生剧烈变化的位置,对应物体的物理边界。HALCON中edges_sub_pix算子使用Canny或Deriche算法提取亚像素精度边缘,输出为XLD(eXtended Line Description)轮廓。亚像素精度意味着边缘位置可以精确到0.1像素甚至更高,这是形状匹配能够达到高精度的基础。

轮廓提取后,通常需要经过segment_contours_xld分割为直线段和圆弧,再用fit_line_contour_xld或fit_circle_contour_xld拟合几何基元。形状匹配的模板正是基于这些轮廓特征构建的,HALCON的create_shape_model会计算轮廓点的梯度方向和幅度,生成多分辨率金字塔模型。

算子功能输出类型适用场景
edges_sub_pix亚像素边缘提取XLD轮廓高精度定位
threshold灰度阈值分割Region区域快速ROI提取
select_shape区域特征筛选Region区域去除噪点
fit_circle_contour_xld圆拟合几何参数圆形工件定位

边缘提取的常见误区是过度依赖单一算法。对于低对比度场景,建议先增强对比度(emphasize算子),再提取边缘。在VC++开发中,XLD轮廓数据量较大,建议在模板创建阶段完成轮廓简化,减少运行时计算负担。

风险提示:边缘提取的阈值参数(Low和High)设置不当会导致边缘断裂或伪边缘。建议使用HALCON的edges_sub_pix自动阈值模式('canny'),并通过contour_point_num_xld检查轮廓点数,确保轮廓完整性。

2.5 案例拆解:手机中框定位中的基础概念应用

以手机中框的视觉定位为例,该工件为矩形金属框,表面有高光倒角,背景为黑色吸光材料。项目要求定位精度±0.05mm,节拍2秒/件。初始方案直接使用全局阈值分割,结果在倒角区域出现大量反光噪点,导致模板匹配失败。

分析过程:首先检查图像灰度直方图,发现目标与背景灰度重叠严重,无法用单一阈值分离。改用edges_sub_pix提取亚像素边缘,但高光区域产生伪边缘。最终方案是:先使用gauss_filter平滑图像,再提取边缘,然后通过select_contours_xld按轮廓长度和方向筛选,保留矩形四边轮廓。

关键参数设置:高斯滤波核5×5,Canny阈值Low=20,High=40,轮廓长度筛选范围200~500像素。匹配时使用create_shape_model创建金字塔模型,金字塔层数4层,最小对比度10。实际运行结果:匹配耗时85ms,定位精度±0.03mm,满足产线需求。

复盘经验:形状匹配的成败往往不在匹配阶段,而在前期的图像预处理和轮廓提取。本项目最大的教训是:不要试图用单一算法解决所有问题,而是组合使用滤波、边缘提取和轮廓筛选。另外,模板创建时的ROI选择至关重要,应尽量包含工件的独特几何特征,避免对称区域导致匹配歧义。