halcon connection_基于halcon的字符识别,附源码和解析

c47be5e9a89ef4a33ab7bf67515c18ea.png

大体步骤:1.读取图片

                  2.图像预处理(阈值分割,提取标签部分,缩小处理区域)

                 3.将标签区域的最小外接矩形,从原图中剪切

                 4.图像旋转,将文字摆正 

                 5.水平分割

                6.局部阈值分割,提取出ROI

               7.创建词典(之所以不直接使用字符模板直接识别,是因为,直接识别的话,字母O会被识别为数字0 等等异常识别,使用字典会比较准确识别)

               8.读取识别模板

              9.使用字典进行识别

 关键点:字典    局部阈值分割    水平分割  

注意点:halcon字符识别自带模板是基于白底黑字  ,输入的图像要进行转换  保证是二值化图像 并且是白底黑字,

如果是黑底白字,使用算子 invert_image  进行图像翻转。

dev_close_window()read_image (Image, 'label/label_01.png')dev_open_window (0, 0, 512, 512, 'black', WindowHandle)*dev_open_window (0, 0, 512, 512, 'black', WindowHandle1)dev_set_window (WindowHandle)dev_display (Image)*固定阈值分割threshold (Image, Region, 128, 230)*区域连通connection (Region, ConnectedRegions)*区域筛选select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 47000, 59000)*开运算opening_circle (SelectedRegions, RegionOpening, 4)*回去最小外接矩形shape_trans (RegionOpening, RegionTrans, 'rectangle2')*水平分割text_line_orientation (RegionTrans, Image, 25, -0.523599, 0.523599, OrientationAngle)*创建矩阵但也hom_mat2d_identity (HomMat2DIdentity)*求变换矩阵关系hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, 0, 0, Deskew)*原图变化 旋转affine_trans_image (Image, ImageAffineTrans, Deskew, 'constant', 'false')*区域旋转affine_trans_region (RegionTrans, RegionAffineTrans, Deskew, 'nearest_neighbor')*外接矩形参数smallest_rectangle1 (RegionAffineTrans, Row1, Column1, Row2, Column2)*图像截取reduce_domain (ImageAffineTrans, RegionAffineTrans, ocrimage)*通过局部平均值和标准偏差进行阈值图像。试用场合不均匀的照明或噪声的图像*第一个输入参数:输入图像*第二个输出参数:分割后的区域*第三个输人参数:均值和标准差的掩码宽度*第四个输入参数:均值和标准差的掩码高度*第五个输入参数:标准差因子*第六个输入参数:最小灰度值和均值之差*第七个输入参数:提取区域的类型,是亮的区域,或暗的区域,或相似区域,或不相似区域var_threshold (ocrimage, Region1,40, 40, 0.8, 10, 'dark')connection (Region1, ConnectedRegions1)*水平分割partition_dynamic (ConnectedRegions1, Split, 21, 40)*选择文字整体select_shape (Split, Characters, ['width','height'], 'and', [10,20], [30,50])*选择单词部分select_shape (Characters, word_image, 'row', 'and', 0,Row1+80)*选择日期部分select_shape (Characters, date_image, 'row', 'and', Row1+80, 500)*排序sort_region (word_image, SortedRegions, 'character', 'true', 'row')*获取区域参数 面积 行 列area_center (SortedRegions, Area, Row, Column)Column[|Column|]:=888gen_empty_obj (word)text:=''text_word_all:=''text_date_all:=''*创建词典create_lexicon ('label', ['BEFORE','BEST','END'], LexiconHandle)*读取模型read_ocr_class_mlp ('Industrial_NoRej', OCRHandle)for i := 1 to |Column|-1 by 1    select_obj (word_image, ObjectSelected, i)    concat_obj (word, ObjectSelected, word)    if (i==|Column| or (Column[i]-Column[i-1])>30)        *开始识别        *第一个参数 要识别的图        *第二个参数  原图        *第六个参数表示误差范围,既和字典中单词对比 长度误差范围        do_ocr_word_mlp (word, ocrimage, OCRHandle, '', 3, 2, Class, Confidence, text_1, Score)        text:=text+' '+text_1        gen_empty_obj (word)    endifendfortext_word_all:=text*下面开始识别日期部分*排序sort_region (date_image, SortedRegions1, 'character', 'true', 'row')*使用正则表达式识别*^ 开始 ()子表达式 [] 标记一个中括号表达式的开始  |  指明两项之间的一个选择t:='^([0-2][0-9]|30|31)/(0[1-9]|10|11|12)/0[0-5]$'do_ocr_word_mlp (SortedRegions1, ocrimage, OCRHandle, t, 10, 5, Class1, Confidence1, Word, Score1)text_date_all:=Word*清除窗体dev_clear_window ()dev_display (ocrimage)*设置多颜色显示 dev_set_colored (6)dev_display (word_image)dev_display (date_image)*设置字体set_display_font (WindowHandle, 20, 'mono', 'true', 'false')*在窗体中显示文字disp_message (WindowHandle,'字母部分:'+ text_word_all, 'image', 10, 10, 'red', 'true')disp_message (WindowHandle,'日期部分:'+ text_date_all, 'image', 40, 40, 'green', 'true')

 9d4d0044d47d9c63f9922daf798e3974.png

来源:https://www.cnblogs.com/chenenfu/p/11765772.html

001c3640e0ea7f1120b66e33894384bd.gif End 001c3640e0ea7f1120b66e33894384bd.gif

声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值