halcon ocr(汉字)训练识别
dev_update_off ()
dev_close_window ()
*加载图片并对图片进行预处理(直方图均衡(增加图片亮度),线性变换,阈值处理
*【目的:把汉字区域选择出来,文字区域与其他干扰区域不连接】
read_image (Image, 'F:/Download/images/汉字.jpg')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
rgb1_to_gray (Image, GrayImage)
equ_histo_image (GrayImage, ImageEquHisto)
scale_image (ImageEquHisto, ImageScaled, 2.25664, -273)
threshold (ImageScaled, Regions, 25, 255)
dev_display (Regions)
*对阈值处理后的图片进行膨胀,区域分离,特征选择【把每个文字单独形成一个独立区域,并选择出来】
closing_rectangle1 (Regions, RegionClosing,3,2.5)
connection (RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions1, ['row1','column1'], 'and', [244,118], [337.3,421.22])
*在选择的文字区域上与阈值化后的区域有交集的部分形成显得更精确的文字区域
*【把文字区域膨胀后多余的部分删除】并进行排序
intersection (SelectedRegions1,Regions,RegionIntersection1)
closing_rectangle1 (RegionIntersection1, RegionClosing1, 1, 2)
sort_region (RegionClosing1, SortedRegions1, 'character','true', 'row')
dev_display (SortedRegions1)
count_obj (SortedRegions1, Number)
*在阈值化后的区域上把与选择的文字区域有交集的部分选择出来(所有文字形成一个区域),
*形成区域的外接平行矩形并从原图中截取出来,
*最后再进行颜色反转把白色文字转成黑色文字
intersection (Regions,SelectedRegions1,RegionIntersection2)
shape_trans (RegionIntersection2, RegionTrans, 'rectangle1')
reduce_domain (Image, RegionTrans, ImageReduced)
invert_image (ImageReduced, ImageInvert)
*定义训练文字变量和训练文件
words:=['驱','油','用','表','面','活','性','剂','的','界','面','化','学','与','界','面','流','变','学']
TrainFile:='G:/Halcon/words.trf'
*把训练文字变量区域与训练文字变量关联起来(通过区域找到相应图片中的文字把图片与文字变量联系起来)
*并把联系存放在训练文件中【逐字添加】
for i:=1 to Number by 1
select_obj (SortedRegions1, ObjectSelected, i)
append_ocr_trainf(ObjectSelected,ImageInvert,words[i-1],TrainFile)
*将单个字符区域、单个字符图像和对应的字符文本联系写入TrainingFile 文件
dev_display (ObjectSelected)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endfor
*此处是因为
words:=['驱','油','用','表','面','活','性','剂','的','界','化','学','与','流','变']
FontFile:='G:/Halcon/words.omc'
*创建神经网络分类器,并进行训练,最后将训练结果文件存放在FontFile中
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
*查询.trf训练文件中存储有哪些字符,以及每个字符在训练器中的数量。
create_ocr_class_mlp (8, 10, 'constant', 'default',words, 80, 'none', 15, 42, OCRHandle)
*创建神经网络分类器 8,10分别是要识别的字符的宽度和高度,80是神经网络的隐藏层,15转化后的特征数量,
*42 ,随机数种子
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
*训练神经网络分类器 Maxepochs:200 最大迭代数 1:MLP权重更新阈值 0.01:两次迭代的loss值差的阈值
write_ocr_class_mlp (OCRHandle, FontFile)
*将训练好的分类器模型保存到FontFile中
clear_ocr_class_mlp (OCRHandle)
*清除训练文件句柄
*进行分类识别测试
dev_display(SortedRegions1 )
read_ocr_class_mlp (FontFile, OCRHandle1)
*读取训练好的分类模型文件 句柄为OCRHandle1
do_ocr_multi_class_mlp (SortedRegions1, ImageInvert, OCRHandle1, Class, Confidence)
*将选中的文字区域在暗字图片上进行分类识别
*把分类识别的字体显示在相应的文字下方
smallest_rectangle1 (SortedRegions1, Row1, Column1, Row2, Column2)
for i:=1 to Number by 1
disp_message (WindowHandle, Class[i-1], 'window', Row2[i-1], Column1[i-1]+(Column2[i-1]-Column1[i-1])/6.5, 'yellow', 'false')
stop ()
endfor
disp_message (WindowHandle, Class, 'window', 12, 12, 'green', 'false')
原图(百度得来)
阈值处理后的图片
汉字区域独立
将膨胀后的文字区域删除
将要识别的文字图片从原图中截取出来并进行处理
进行数据增强的步骤
最后结果识别
总览
原图
结果
给个赞吧