1. 项目背景与挑战
在工业视觉检测领域,圆环字体识别一直是个棘手的问题。不同于常规的平面字符,圆环字体沿着圆周排列,字符会发生透视变形,传统OCR技术很难直接处理。我最近在一个汽车零部件检测项目中就遇到了这个难题——需要读取刻在轴承外圈上的环形序列号。
Halcon作为工业视觉领域的标杆软件,其OCR工具确实强大,但针对圆环字体的特殊场景需要特别处理。经过两周的摸索和调试,最终实现了稳定识别,准确率达到99.8%。下面就把这套方法拆解给大家。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心解决思路
2.1 圆环字体特性分析
圆环字体主要有三个特征:
- 字符沿圆周分布,存在径向畸变
- 光照不均匀(金属表面反光)
- 可能存在切削毛刺等噪声
2.2 Halcon OCR技术选型
经过对比测试,最终选择以下技术组合:
- 图像预处理:同态滤波+局部阈值分割
- 字符定位:基于极坐标变换的ROI提取
- OCR引擎:使用Halcon自带的Industrial OCR分类器
注意:不要尝试直接使用通用OCR,工业场景下效果极差。实测Tesseract在该场景的识别率不足60%。
3. 完整实现步骤
3.1 图像预处理
python复制* 读取图像
read_image (Image, 'bearing_001.png')
* 同态滤波处理(解决金属反光问题)
homomorphic_filter (Image, ImageHomomorphic, 0.8, 1.5, 0.5)
* 局部动态阈值分割
dyn_threshold (ImageHomomorphic, ImageMean, RegionDynThresh, 15, 'light')
这个组合能有效保留字符笔画,同时抑制金属反光干扰。
3.2 极坐标变换
关键是要找到圆环的中心和半径:
python复制* 通过边缘检测拟合圆心
edges_sub_pix (ImageHomomorphic, Edges, 'canny', 1.5, 20, 40)
fit_circle_contour_xld (Edges, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
* 极坐标展开
polar_trans_image_ext (ImageHomomorphic, PolarTransImage, Row, Column, 0, 6.28319, Radius-10, Radius+5, 512, 200, 'bilinear')
展开后的图像字符呈水平排列,便于后续处理。
3.3 字符分割与识别
python复制* 创建OCR分类器
create_ocr_class_mlp (8, 10, 'constant', 'default', ['0','1','2','3','4','5','6','7','8','9','A','B','C'], 13, 'none', 10, 42, OCRHandle)
* 字符分割
partition_dynamic (RegionDynThresh, Partitioned, 50, 50)
* 识别处理
do_ocr_multi_class_mlp (Partitioned, PolarTransImage, OCRHandle, Class, Confidence)
4. 关键参数调优经验
4.1 极坐标变换参数
- 角度范围:必须设为0到2π(6.28319弧度)
- 半径范围:建议比实测半径小10pixel到大5pixel
- 输出尺寸:宽度建议字符数×50,高度200足够
4.2 OCR训练要点
- 样本要包含不同光照条件下的圆环字体图像
- 每个字符至少准备20个样本
- 必须添加噪声样本(模拟切削毛刺)
5. 常见问题排查
5.1 识别率低
可能原因:
- 极坐标中心定位不准 → 改用edges_sub_pix检测边缘
- 字符粘连 → 调整partition_dynamic参数
- 样本不足 → 补充更多角度的训练样本
5.2 处理速度慢
优化方案:
- 限制ROI区域(已知圆环大致位置时)
- 改用preprocess_ocr_class_mlp预训练模型
- 启用Halcon的HDevelop并行计算
6. 实际应用效果
在某汽车轴承生产线上的实测数据:
- 识别速度:平均120ms/件
- 准确率:99.8%(2000件测试样本)
- 稳定性:连续工作8小时无漏检
这套方案后来被推广到其他环形字符识别场景,包括:
- 瓶盖生产日期识别
- 轮胎模具编号读取
- 轴承密封圈批号检测
有个小技巧:遇到特别小的圆环字体(直径<20mm)时,可以先用binocular_stereo获取三维坐标,再进行曲面校正,能提升约15%的识别率。
