【Halcon学习笔记】09.字符检测
1.概述
光学字符识别(OCR)是在图像中识别字符的过程。它包含两个任务:将图像中单个字符分割出来以及将分割得到的字符进行分类,即分割得到一个区域后分配一个符号标记。
字符分割涉及图像预处理、图像分割、形态学运算、区域特征等知识(本节不重点阐述)。字符分类具体含义是将一个目标字符根据某种特征划到某个类别中去,即为分类器。Halcon提供了不同的分类器,其中比较重要的分类器有:基于神经网络的MLP分类器、基于支持向量机的SVM分类器、基于高斯混合模型的GMM分类器、基于k临近的k-NN分类器。其中MLP分类器在字符识别中较为常用。

2.相关算子
2.1 创建、添加(将字符添加到.trf训练文件中)
append_ocr_trainf()
Character:字符Region
Image:字符Image
Class:字符文本
TrainingFile:OCR训练的.trf文件路径(路径文件不存在时自动创建)
2.2 查询(查询.trf训练文件中存储有哪些字符,以及每个字符在训练器中的数量)
read_ocr_trainf_names()
TrainingFile:OCR训练的.trf文件路径
CharacterNames:所读取的字符文本
CharacterCoun:字符文本的数量
2.3 创建(创建mlp类型的OCR分类器)
create_ocr_class_mlp()
WidthCharacter:字符宽度
HeightCharacter:字符高度
Interpolation:字符缩放样式
Features:用于分类的特征
Characters:要读取的字符集的所有字符
NumHidden:对MLP隐藏单元数
Preprocessing:用于转换特征向量的预处理类型
NumComponents:变换特征的个数
RandSeed:随机数生成器的种子值
OCRHandle:OCR分类器句柄
2.4 训练(用训练样本训练OCR分类器)
trainf_ocr_class_mlp()
OCRHandle:OCR分类器句柄
TrainingFile:OCR训练的.trf文件路径
MaxIterations:优化算法的最大迭代次数
WeightTolerance:优化算法两次迭代中MLP权重差的阈值
ErrorTolerance:优化算法两次迭代训练数据上MLP平均误差的阈值
Error:训练数据中MLP的平均误差
ErrorLog:训练数据上的MLP的平均误差作为优化算法迭代次数的函数
2.5 保存(保存OCR的.omc分类器到本地)
write_ocr_class_mlp()
OCRHandle:OCR分类器句柄
FileName:OCR分类器.omc文件路径
2.6 读取(从本地路径中读取OCR的.omc分类器)
read_ocr_class_mlp
FileName:OCR分类器.omc文件路径
OCRHandle:OCR分类器句柄
2.7 识别(识别出最符合的字符)
do_ocr_multi_class_mlp
Character:需要识别的字符Region
Image:需要识别的字符Image
OCRHandle:OCR分类器句柄
Class:识别出的字符文本
Confidence:识别的自信度
2.8 释放(释放OCR分类器)
clear_ocr_class_mlp()
OCRHandle:OCR分类器句柄
3.字符检测在Halcon中的应用步骤
OCR检测一般分为离线训练和在线检测两部分。

3.1 离线训练实现步骤
1)读取样本图像,分割单个字符区域
read_image (Image, path+'/Traning.bmp')
threshold (Image, Region1, 0, 10)
connection (Region1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
count_obj (SortedRegions, Number)
if (Number#10)
disp_message (WindowHandle, '分割错误', 'window', 0, 0, 'red', 'false')
stop ()
endif
select_obj (SortedRegions, ObjectSelected1, 1)

2)将分割出的区域添加到训练文件中
smallest_rectangle1 (ObjectSelected1, Row11, Column11, Row21, Column21)
charWidth:=Row21-Row11
charHeight:=Column21-Column11
charList:=[ '0','1','2','3','4','5','6','7','8','9']
for Number := 1 to Number by 1
select_obj (SortedRegions, ObjectSelected, Number)
append_ocr_trainf (ObjectSelected, Image, charList[Number-1], path+'/Model0-9.trf')
endfor
3)获取字符列表,创建、训练、保存OCR分类器
read_ocr_trainf_names (path+'/Model0-9.trf', CharacterNames, CharacterCount)
create_ocr_class_mlp (charWidth, charHeight, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, path+'/Model0-9.trf', 200, 1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, path+'/Model0-9.omc')
dev_display (Image)
disp_message (WindowHandle, '训练完成', 'window', 0, 0, 'green', 'false')
3.2 在线检测实现步骤
1)读取检测图像
2)提取图像中单个字符区域
3)读取OCR分类器
4)使用OCR分类器对区域字符进行分类
5)释放分类器
read_ocr_class_mlp (path+'/Model0-9.omc', OCRHandle)
list_files (path, ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg|jpeg)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
threshold (Image, Region1, 0, 1)
connection (Region1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
count_obj (SortedRegions, Number)
do_ocr_multi_class_mlp (SortedRegions, Image, OCRHandle, Class, Confidence)
dev_display (Image)
for Number := 1 to Number by 1
disp_message (WindowHandle, Class[Number-1], 'image', 100, 30+((Number-1)*59), 'green', 'false')
endfor
endfor
endif
clear_ocr_class_mlp (OCRHandle)

4.补充
4.1 注意事项
1)关于分类器文件。Halcon内置了许多针对数字、字母的.omc分类器,识别目标为标准、非中文字符,是可以直接调用这些分类器文件(路径:.\MVTec\HALCON-12.0\ocr);如果识别目标不属于这些情况,需要自己训练。
2)关于训练分类器。Halcon的OCR助手可以快速便捷训练分类器。其步骤为:加载图片>>框选识别目标>>输入目标文本>>应用快速设置>>创建新的训练文件>>加入训练数据>>开始训练。
3)关于训练分类器。训练时,尽量把字符本身转正;尽量用多一点的数据去训练。
4)关于字符分割。离线训练和在线检测的程序中,图像预处理和阈值分割方式要尽量保持一致,这样才能得到最好的识别效果。

by Ryou2-