Halcon识别OCR

摘要

  功能

提取字符并识别

  基本步骤如下

1.加载图像
2.预处理
3.分割提取
4.识别
5.显示

Halcon代码:点阵字符

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

*1 图像采集
read_image (Image, '2.jpg')

*2 预处理
rgb1_to_gray (Image, GrayImage)
emphasize (GrayImage, ImageEmphasize, 9, 9, 1)
threshold (ImageEmphasize, Regions, 0, 200)
opening_rectangle1 (Regions, RegionOpening, 2, 2)

*3 分割提取所有字符
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, ['area','row','column'], 'and', [0,86.3,33.68], [1401.67,135.46,200])
union1 (SelectedRegions1, RegionUnion)
shape_trans (RegionUnion, RegionTrans1, 'rectangle2')

* 转正
area_center (RegionTrans1, Area, Row, Column)
orientation_region (RegionTrans1, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
affine_trans_region (RegionTrans1, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'constant', 'false')

* 抠图
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced1)
rgb1_to_gray (ImageReduced1, GrayImage)
threshold (GrayImage, Regions2, 0, 228)
closing_rectangle1 (Regions2, RegionClosing, 2, 2)
connection (RegionClosing, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions, 'area', 'and', 39.54, 196.86)
shape_trans (SelectedRegions, RegionTrans, 'rectangle1')


*4 识别
*4.1 字符分割(所有字符连接起来再求交集)
partition_rectangle (RegionTrans, Partitioned, 12, 15) //切西瓜
intersection (Partitioned, Regions2, RegionIntersection)
sort_region (RegionIntersection, SortedRegions, 'character', 'true', 'row')

*4.2 识别
read_ocr_class_mlp ('DotPrint_0-9A-Z_Rej.omc', OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageAffinTrans, OCRHandle, Class, Confidence)
smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2)
count_obj (SortedRegions, Number)

*5 显示
dev_display (Image)
set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
for i := 1 to Number by 1
     disp_message (WindowHandle, Class[i - 1], 'image', Row2[i - 1], Column1[i - 1], 'green', 'false')
endfor
stop ()
clear_ocr_class_mlp (OCRHandle)

在这里插入图片描述

Halcon代码:凹陷字符

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

*1 图像采集
read_image (Image, '4.bmp')

*2 预处理(找到字符)
gray_range_rect (Image, ImageResult, 5, 5)
emphasize (ImageResult, ImageEmphasize, 100, 100, 2)
rgb1_to_gray (ImageEmphasize, GrayImage)


threshold (GrayImage, Regions, 54, 153)
connection (Regions, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions2, ['area','row'], 'and', [435.24,210.25], [1326.96,306.49])
*找到需要旋转的区域
union1 (SelectedRegions2, RegionUnion)
shape_trans (RegionUnion, RegionTrans1, 'rectangle2')


*3 分割提取所有字符
area_center (RegionTrans1, Area, Row, Column)
orientation_region (RegionTrans1, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
affine_trans_region (RegionTrans1, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
affine_trans_image (ImageEmphasize, ImageAffinTrans, HomMat2D, 'constant', 'false')


* 抠图(找字符)
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)
threshold (ImageReduced, Regions1, 54, 153)
connection (Regions1, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions3, ['area','row'], 'and', [435.24,210.25], [1326.96,306.49])
shape_trans (SelectedRegions3, RegionTrans, 'rectangle1')

*4 识别
sort_region (RegionTrans, SortedRegions1, 'character', 'true', 'row')
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)
invert_image (ImageAffinTrans, ImageInvert)
do_ocr_multi_class_mlp (SortedRegions1, ImageInvert, OCRHandle, Class1, Confidence)
count_obj (SortedRegions1, Number)

*5 显示
dev_display (Image)
set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
disp_message (WindowHandle, Class1,  'window', 0,0, 'black', 'true')
clear_ocr_class_mlp (OCRHandle)


* dev_display (Image)
* for i := 1 to Number by 1
*      select_obj (SortedRegions1, ObjectSelected, i)
*      do_ocr_single_class_mlp (SortedRegions1, Image, OCRHandle, 1, Class2, Confidence1)
* disp_message (WindowHandle, Class2, 'window', 12, 12, 'black', 'true')
* endfor
* stop ()

在这里插入图片描述

Halcon代码:环形字符

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*1 图像采集
read_image (Image3, '3.bmp')
rgb1_to_gray (Image3, GrayImage)

*2预处理(提取环形区域同时得到内外圆半径)
threshold (GrayImage, Regions, 4, 103)
shape_trans (Regions, outcircle, 'outer_circle')
*下面这句是为了求一个补集
complement (Regions, RegionComplement)
connection (RegionComplement, InnerCircle)
select_shape (InnerCircle, SelectedRegions, ['area','circularity'], 'and', [200,0.8422], [2.29055e+006,1])
smallest_circle (Regions, Row, Column, OuterRadius)
smallest_circle (SelectedRegions, InnerRow, InnerColumn, InnerRadius)
*3预处理(极坐标转换)
polar_trans_image_ext (Image3, PolarTransImage, Row, Column, rad(360), 0, OuterRadius - 100, InnerRadius + 40, 1440, 100, 'bilinear')
*预处理(对比度变换)
invert_image (PolarTransImage, ImageInvert)
scale_image (ImageInvert, ImageScaled1, 6.71053, -1429)
*5字符分割
binary_threshold (ImageScaled1, Region2, 'max_separability', 'light', UsedThreshold2)
connection (Region2, ConnectedRegions3)
select_shape (ConnectedRegions3, SelectedRegions1, 'area', 'and', 64.69, 1000)
* select_shape (SelectedRegions1, SelectedRegions2, 'moments_m11', 'and', -4893.94, 3742.42)

dilation_rectangle1 (SelectedRegions1, RegionDilation, 5, 5)
union1 (RegionDilation, RegionUnion)
connection (RegionUnion, ConnectedRegions2)
dev_clear_window ()
dev_display (ConnectedRegions2)
intersection (ConnectedRegions2, Region2, RegionIntersection)
sort_region (RegionIntersection, SortedRegions1, 'character', 'true', 'column')
* select_shape (SortedRegions1, SelectedRegions2, 'moments_m21', 'and', -16513.8, 100000)


read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)

*6识别
do_ocr_multi_class_mlp (SortedRegions1, PolarTransImage, OCRHandle, Class, Confidence)

stop ()
*7显示
count_obj (SortedRegions1, Number)
area_center (SortedRegions1, Area, Row2, Column2)
dev_display (Image3)
dev_display (SortedRegions1)
for Index := 1 to Number by 1
    disp_message (WindowHandle, Class[Index-1], 'PolarTransImage', 80, Column2[Index-1]-20, 'black', 'true')
endfor

在这里插入图片描述

Halcon代码:有干扰背景的字符


******************************1.窗口设置**************************
* 读取图片
read_image (Image, 'ocr/color_form_01')
* 获取图片信息
get_image_pointer3 (Image, PointerRed, PointerGreen, PointerBlue, Type, Width, Height)
* 关闭窗口
dev_close_window ()
* 打开新窗口
dev_open_window (0, 0, Width, Height, 'black', WindowID)
* 显示图片
dev_display (Image)
* 设置线宽
dev_set_line_width (3)
* 设置填充模式
dev_set_draw ('margin')
* 更新窗口关闭
dev_update_window ('off')
* 读取字库
read_ocr_class_mlp ('Industrial_0-9_NoRej', OCRHandle)


******************************2.循环读取图片处理**************************

NumImages := 8
for img := 1 to NumImages by 1
    *************************2.1提取字符**************
    ***(1)获取到干扰线
    * 循环读取图片
    read_image (Image, 'ocr/color_form_0' + img)
    * 均值滤波-
    mean_image (Image, Mean, 3, 3)
    * 拆通道-rgb
    decompose3 (Mean, Red, Green, Blue)
    * 二值化
    threshold (Green, ForegroundRaw, 0, 220)
    * 剪切二值化区域
    clip_region (ForegroundRaw, Foreground, 3, 3, Height - 4, Width - 4)
    * 抠图-红色
    reduce_domain (Red, Foreground, RedReduced)
    * 抠图-绿色
    reduce_domain (Green, Foreground, GreenReduced)
    * 相减-
    sub_image (RedReduced, GreenReduced, ImageSub, 2, 128)
    * 均值滤波-模糊去燥
    mean_image (ImageSub, ImageMean, 3, 3)
    * 快速二值化提取暗的区域
    binary_threshold (ImageMean, Cluster1, 'smooth_histo', 'dark', UsedThreshold)
    
    ***(2)获取到字体
    * 求差
    difference (Foreground, Cluster1, Cluster2)
    * 
    concat_obj (Cluster1, Cluster2, Cluster)
    * 圆的开运算
    opening_circle (Cluster, Opening, 2.5)
    * 
    smallest_rectangle1 (Opening, Row1, Column1, Row2, Column2)
    * 针对两幅图像选择处理
    WidthCluster := Column2 - Column1 + 1
    if (WidthCluster[0] > WidthCluster[1])
        select_obj (Opening, NumberRegion, 2)
    else
        select_obj (Opening, NumberRegion, 1)
    endif
    * 闭运算
    closing_rectangle1 (NumberRegion, NumberCand, 1, 20)
    * 求差-求面积
    difference (Image, NumberCand, NoNumbers)
    * 断开联通区域
    connection (NumberRegion, NumberParts)
    * 计算灰度值的平均值和偏差
    intensity (NumberParts, Green, MeanIntensity, Deviation)
    * 填充区域之间的空白(取决于灰度值或颜色)或分割重叠区域-拓展两个区域链接
    expand_gray_ref (NumberParts, Green, NoNumbers, Numbers, 20, 'image', MeanIntensity, 48)
    * 联合在一起-由于有不同区域
    union1 (Numbers, NumberRegion)
    * 断开连通域
    connection (NumberRegion, Numbers)
    * 填充小的孔洞
    fill_up_shape (Numbers, RegionFillUp, 'area', 1, 100)
    * 开运算去除感染
    opening_circle (RegionFillUp, FinalNumbersUnsorted, 3.5)
    * 排序
    sort_region (FinalNumbersUnsorted, FinalNumbers, 'character', 'true', 'row')
    
    
    *****************************2.2 构图形成白底黑字*************************
    * 显示颜色设置
    dev_set_color ('blue')
    * 显示图像区域
    dev_display (Image)
    dev_display (FinalNumbers)
    
    * 选择对象
    count_obj (FinalNumbers, NumNumbers)
    * 联合到一起
    union1 (FinalNumbers, NumberRegion)
    * 求差
    difference (Image, NumberRegion, NoNumbers)
    * 喷涂-背景
    paint_region (NoNumbers, Red, ImageOCRRaw, 255, 'fill')
    * 喷涂-字体
    paint_region (NumberRegion, ImageOCRRaw, ImageOCR, 0, 'fill')
    
    
    ****************************2.3 OCR识别字体*************************************
    * 使用mlp识别
     do_ocr_multi_class_mlp (FinalNumbers, ImageOCR, OCRHandle, RecChar, Confidence)
     *设置显示清空
    set_display_font (WindowID, 27, 'mono', 'true', 'false')
    * 提示信息
    disp_message (WindowID, sum(RecChar), 'window', 32, 24, 'blue', 'false')
    * 显示
    if (img < NumImages)
        * 暂停
        set_display_font (WindowID, 16, 'mono', 'true', 'false')
        disp_continue_message (WindowID, 'black', 'true')
        stop ()
    endif
endfor
* 清除句柄变量
clear_ocr_class_mlp (OCRHandle)
* 恢复窗口更新
dev_update_window ('on')

在这里插入图片描述

更多详情了解:https://blog.csdn.net/qq_32015315/article/details/141663063

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值