halcon第五讲:汉字识别

基于halcon的汉字识别:

【1】、字符分割;

【2】、创建trf训练文件,即将字符图像和字符关联起来write_ocr_trainf;(可通过打开ocr训练文件浏览器加载刚才创建的trf训练文件进行浏览,还可生成异形文字,如下图所示)

【3】、读取trf训练文件,得到所有类别及其对应的个数,read_ocr_trainf_names;

【4】、创建分类器create_ocr_class_mlp;

【5】、训练分类器trainf_ocr_class_mlp;

【6】、保存omc文件,即训练好的分类器write_ocr_class_mlp(可以不保存直接进行识别,如果下次还要用的话最好保存下来,下次直接读取该训练好的模型进行识别就好);

【7】、读取omc文件read_ocr_class_mlp;

【8】、识别do_ocr_multi_class_mlp。

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, '1.jpg')
rgb1_to_gray (Image, GrayImage)
*线性灰度变换
scale_image (GrayImage, ImageScaled, 1.34921, -89)
*定位校正
threshold (ImageScaled, Regions, 152, 226)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [0,243.86], [22589.8,599.24])
union1 (SelectedRegions, RegionUnion)
shape_trans (RegionUnion, RegionTrans, 'rectangle2')
orientation_region (RegionTrans, Phi)
area_center (RegionTrans, Area, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
affine_trans_image (GrayImage, ImageAffinTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions1, 194, 230)
closing_rectangle1 (Regions1, RegionClosing, 6, 6)
connection (RegionClosing, ConnectedRegions1)
count_obj (ConnectedRegions1, Number)

*要把断开的字形成一个整体的连通域union将所有连通域联合,union2将指定两个连通域联合
*在多个连通域中选择单个连通域,可在该图像上右击显示目录查看是第几个连通域,
*并将它们进行联合,或者先对这些连通域进行个排序,sort_region
*数
select_obj (ConnectedRegions1, RegionUnion1, 1)
*字
select_obj (ConnectedRegions1, ObjectSelected1, 2)
select_obj (ConnectedRegions1, ObjectSelected2, 9)
union2 (ObjectSelected1, ObjectSelected2, RegionUnion2)
*图
select_obj (ConnectedRegions1, ObjectSelected3, 7)
select_obj (ConnectedRegions1, ObjectSelected4, 10)
union2 (ObjectSelected3, ObjectSelected4, RegionUnion3)
*像
select_obj (ConnectedRegions1, RegionUnion4, 4)
*处
select_obj (ConnectedRegions1, ObjectSelected5, 5)
select_obj (ConnectedRegions1, ObjectSelected6, 6)
union2 (ObjectSelected5, ObjectSelected6, RegionUnion5)
*理
select_obj (ConnectedRegions1, ObjectSelected7, 3)
select_obj (ConnectedRegions1, ObjectSelected8, 8)
union2 (ObjectSelected7, ObjectSelected8, RegionUnion6)
*与
select_obj (ConnectedRegions1, ObjectSelected8, 12)
select_obj (ConnectedRegions1, ObjectSelected9, 18)
union2 (ObjectSelected8, ObjectSelected9, RegionUnion7)
*机
select_obj (ConnectedRegions1, RegionUnion8, 14)
*器
select_obj (ConnectedRegions1, RegionUnion9, 15)
*视
select_obj (ConnectedRegions1, RegionUnion10, 13)
*觉
select_obj (ConnectedRegions1, ObjectSelected10, 11)
select_obj (ConnectedRegions1, ObjectSelected11, 16)
select_obj (ConnectedRegions1, ObjectSelected12, 17)
union2 (ObjectSelected10, ObjectSelected11, RegionUnion11)
union2 (RegionUnion11, ObjectSelected12, RegionUnion11)

*创建一个空的对象元组
gen_empty_obj (EmptyObject)
*将其它连通域添加到该对象元组中
concat_obj (EmptyObject, RegionUnion1, EmptyObject)
concat_obj (EmptyObject, RegionUnion2, EmptyObject)
concat_obj (EmptyObject, RegionUnion3, EmptyObject)
concat_obj (EmptyObject, RegionUnion4, EmptyObject)
concat_obj (EmptyObject, RegionUnion5, EmptyObject)
concat_obj (EmptyObject, RegionUnion6, EmptyObject)
concat_obj (EmptyObject, RegionUnion7, EmptyObject)
concat_obj (EmptyObject, RegionUnion8, EmptyObject)
concat_obj (EmptyObject, RegionUnion9, EmptyObject)
concat_obj (EmptyObject, RegionUnion10, EmptyObject)
concat_obj (EmptyObject, RegionUnion11, EmptyObject)

*【1】创建trf训练文件,即将字符图像和字符关联起来
*如果这些字符图像在一幅图像中,一个一个添加用append_ocr_trainf,
*可以直接用write_ocr_trainf把所有字符图像全部写进去
trainfile := 'words.trf'
words:=['数','字','图','像','处','理','与','机','器','视','觉']
write_ocr_trainf (EmptyObject, ImageAffinTrans, words, trainfile)

*【2】读取训练文件
read_ocr_trainf_names (trainfile, CharacterNames, CharacterCount)
*【3】创建模型,注意第五个参数为识别结果的所有类别
create_ocr_class_mlp (10, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
*【4】训练模型
trainf_ocr_class_mlp (OCRHandle, trainfile, 200, 1, 0.01, Error, ErrorLog)

*【5】保存训练好的模型,omc文件
write_ocr_class_mlp (OCRHandle, 'words.omc')

*清除句柄
clear_ocr_class_mlp (OCRHandle)

*【6】读取训练好的模型
read_ocr_class_mlp ('words.omc', OCRHandle1)

*【7】识别
do_ocr_multi_class_mlp (EmptyObject, ImageAffinTrans, OCRHandle1, Class, Confidence)
dev_display (Image)
area_center (EmptyObject, Area1, Row1, Column1)

*设置显示字体的大小
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
for i:=0 to 10 by 1
    disp_message (WindowHandle, Class[i], 'image', Row1[i]-140, Column1[i]-40, 'white', 'false')
endfor

原图和识别结果分别如下:

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82048365