程序练习:4.mlp汉字识别程序(笔画断开的手写汉字)

***********************本程序是汉字识别程序,主要完成了将断开的汉字设计成矩形块目标,然后进行MLP训练学习,
***********************生成.ocm识别文件,可以直接用于库内的汉字识别。识别准确率和样本数量和质量有关,最
*****************重要的还是学习算法的准确度。
dev_close_window ()
read_image (Image, 'F:/7.机器视觉/Halcon/halcon学习/字符识别专题/ncu.JPG')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width/10, Height/10, 'black', WindowHandle)
dev_display (Image)
rgb1_to_gray (Image, GrayImage)

**预处理(此图像对比度较高,刻意不需要)
scale_image (GrayImage, ImageScaled, 0.8, 10)
threshold (GrayImage, Regions, 22, 98)
**形状变换,得到一个包含目标区域的任意矩形
shape_trans (Regions, RegionTrans, 'rectangle2')
orientation_region (RegionTrans, Phi)
**由于Phi为正(x轴上半区)且大于1.5707,所以逆时针旋转校正的时候,会多旋转角度。
**可以用角度减去pi,得到一个负的角度弧度值,逆时针旋转该角度的绝对值,得到想要图像。
pi := 3.14156
Phi := Phi - pi
**对图像和区域进行仿射变换
area_center (RegionTrans, Area, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(0), HomMat2D)
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
affine_trans_image (GrayImage, ImageAffinTrans, HomMat2D, 'constant', 'false')

***由于汉字很多笔画都是分开的,要识别汉字,必须要进行矩形分割
gen_empty_obj (EmptyObject)
dev_display (ImageAffinTrans)
for Index := 1 to 4 by 1
    disp_message (WindowHandle, '请指定区域:','window', 12, 12, 'black', 'true')
    **绘制水平矩形
    draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
    **根据绘制的矩形生成对应的矩形
    gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)        
    reduce_domain (ImageAffinTrans, Rectangle, ImageReduced1)
    threshold (ImageReduced1, Region1, 128, 255)
    opening_circle (Region1, RegionOpening, 1.5)
    *准备接收所有提取的字符区域
    concat_obj (EmptyObject, RegionOpening, EmptyObject)
endfor
sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')
dev_clear_window ()
*制作训练文件
words := ['南','昌','大','学']
TrainFile := 'F://word0.trf'

for Index1:=1 to 4 by 1
    select_obj (SortedRegions1, ObjectSelected1,Index1)
    append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], TrainFile)
endfor

*创建mlp分类器,并制作OCR识别文件
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, 'F:/word0.trf', 200, 1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, 'F:/word0.omc')


*读取OCR文件进行识别
read_ocr_class_mlp ('F:/word0.omc', OCRHandle1)
*传入提取出来的字符,当然,在做训练也要提取,在识别也要进行提取,然后进行识别出结果在Class里面
do_ocr_multi_class_mlp (EmptyObject, Image, OCRHandle1, Class, Confidence)
stop()

**显示识别出来的汉字
dev_display (Image)
for i:=1 to 4 by 1
   disp_message (WindowHandle, Class[i-1], 'image', Row+500, 200*i, 'magenta', 'true')
endfor

                    

        
    由于手机拍摄角度问题,图像是垂直的,所以我需要先进行几何变换得到水平的图像。同时,有些汉字的笔画是断开的,如果二值化处理之后,直接进行区域分割connection操作,有些汉字会被分割成几个部分。这个问题只能通过将汉字分割成一个个矩形块,然后将矩形块内部的区域添加到训练集trf中。最后一步就是创建和训练分类器,得到.omc识别文件字符库。这个字符库可以直接用于识别库内的字符,准确率还是比较高的。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值