光学字符识别(OCR)技术已经成为物理世界与数字世界连接的重要桥梁。它能够将图像中的文字内容转化为可编辑的文本信息,在自动化数据录入、文档归档、车牌识别等领域具有广泛的应用。Halcon作为一款功能强大的机器视觉开发软件,为开发者提供了灵活高效的OCR实现平台。本文将以Halcon为基础,详细解析字符训练与字符识别的完整流程。
字符训练流程详解
在OCR系统中,训练一个准确的字体库是至关重要的第一步。通过对字符进行有效提取和分类,Halcon能够根据训练数据生成用于后续字符识别的模型。以下是字符训练的完整流程及关键技术点。
核心代码解读:字符训练
* 1. 读取图像
read_image (Image, 'Image_20231115174401983.bmp')
* 2. 提取字符区域
segment_characters (Image, Image, ImageForeground, RegionForeground, \
'local_auto_shape', 'false', 'false', 'medium', \
25, 25, 0, 10, UsedThreshold)
* 3. 筛选字符
select_characters (RegionForeground, RegionCharacters, 'true', 'bold', \
50, 53, 'true', 'false', 'variable_width', 'false', \
'wide', 'true', 0, 'completion')
* 4. 去除噪声
select_shape (RegionCharacters, SelectedRegions, 'area', 'and', 200, 1200)
opening_circle (SelectedRegions, RegionOpening, 1.5)
* 5. 排序字符
sort_region (RegionOpening, SortedRegions, 'character', 'true', 'row')
* 6. 训练字体库
Class :=['合','格','2','0','2','3','0','9','1','2','1', \
'4','5','7','2','0','3','8','G']
append_ocr_trainf (SortedRegions, ImageForeground, Class, '合格.trf')
流程描述与技术点
-
读取图像
-
使用
read_image
函数加载带有待识别字符的图像,为训练字体库做准备。
-
-
字符提取
-
使用
segment_characters
提取图像中的字符区域。这一步通过局部自动阈值方法分割字符,是整个流程中影响训练准确性的关键步骤。
-
-
筛选字符与噪声去除
-
通过
select_characters
和select_shape
函数,对字符区域进行精细化处理,剔除非字符区域(如噪声点和干扰线)。 -
使用
opening_circle
对字符区域做形态学操作,使字符轮廓更加清晰。
-
-
字符排序
-
使用
sort_region
函数将字符按照从左到右、从上到下的顺序排列,确保训练数据的顺序与实际场景匹配。
-
-
字体库训练
-
调用
append_ocr_trainf
函数,将提取的字符区域与对应的标签(如“合”“格”或数字字符)绑定,并生成字体库文件(如合格.trf
)。
-
通过上述步骤,一个高质量的OCR字体库即可生成。
字符识别流程详解
在完成字体库训练后,下一步便是字符识别的实际应用。字符识别同样需要图像预处理、字符提取、噪声过滤等步骤,但核心是调用训练好的模型进行字符预测,并将结果以可视化方式展示。
核心代码解读:字符识别
* 1. 配置窗口及字体参数
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 512, 256, 'black', WindowHandle)
set_font (WindowHandle, 'Arial-Bold-20')
* 2. 加载训练好的OCR模型
read_ocr_class_mlp ('合格.omc', OCRHandle)
* 3. 读取图像并获取尺寸
read_image (Image, 'Image_20231115174401983.bmp')
get_image_size (Image, Width, Height)
* 4. 提取字符区域
segment_characters (Image, Image, ImageForeground, RegionForeground, \
'local_auto_shape', 'false', 'false', 'medium', \
25, 25, 0, 10, UsedThreshold)
* 5. 筛选字符与去除噪声
select_characters (RegionForeground, RegionCharacters, 'true', 'bold', \
50, 53, 'true', 'false', 'variable_width', 'false', \
'wide', 'true', 0, 'completion')
select_shape (RegionCharacters, SelectedRegions, 'area', 'and', 200, 1200)
opening_circle (SelectedRegions, RegionOpening, 1.5)
* 6. 排序字符
sort_region (RegionOpening, SortedRegions, 'character', 'true', 'row')
* 7. 执行OCR识别
do_ocr_multi_class_mlp (SortedRegions, ImageForeground, OCRHandle, Class, Confidence)
* 8. 结果展示
dev_clear_window ()
dev_display (Image)
if (|Class|=0)
dev_disp_text ('未识别到字符', 'image', 'top', 'left', 'red', 'box', 'false')
stop ()
endif
dev_disp_text (sum(Class), 'window', 'top', 'left', 'green', 'box', 'false')
* 9. 释放OCR句柄
clear_ocr_class_mlp (OCRHandle)
流程描述与技术点
-
图像处理与字符区域提取
-
图像通过
segment_characters
和select_characters
函数分割,保留字符区域。随后进行噪声过滤与字符排序,确保识别区域清晰、顺序正确。
-
-
加载模型
-
使用
read_ocr_class_mlp
函数加载训练好的OCR模型(如合格.omc
)。该模型包含字体库中字符与标签的关联信息,是实际识别的核心。
-
-
字符识别与置信度评估
-
调用
do_ocr_multi_class_mlp
执行字符识别,并返回识别结果和每个字符的置信度。置信度为用户提供了对识别结果可靠性的参考。
-
-
结果展示
-
使用
dev_disp_text
将识别结果以可视化方式展示,包括成功识别的文本或未识别字符的提示。
-
-
资源释放
-
在识别完成后,调用
clear_ocr_class_mlp
释放OCR句柄,保证程序资源管理规范。
-
总结与应用
通过对Halcon字符训练与识别流程的详细解析,我们可以看到其强大的OCR能力和灵活性。Halcon的字符训练与识别结合了高效的图像处理算法与强大的模型构建功能,适用于多种复杂场景,如车牌识别、文档扫描和工业检测等。
如需获取更多Halcon相关代码或实验数据,请联系博主!