打开halcon,按下ctrl+e打开halcon自带例程。应用范围->光学字符识别->ocrcolort.hdev

* 
* OCR (numbers) with color segmentation
* Creation of training files
* 
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_set_line_width (3)
dev_set_draw ('margin')
dev_set_colored (12)
* dev_update_window ('off')
dev_set_check ('~give_error')
*如果训练过,会有一个ocrcolor.trf文件,先删除掉,重新训练
delete_file ('ocrcolor.trf')
dev_set_check ('give_error')
* 
* Segment all Images
* 
*训练图片中对应的文字数组
TrainChar := ['0','0','5','1','5','3','6','1','4','3','3','6','0','8','6','4','2','5','1','4','3','3','6','0','6','2','0','0','6','2','1','1','6','0','5','0','0','5','1','5','0','0','5','1','5','0','0','5','1','5']
*每幅图中文字的个数
NumTrainChar := [8,8,8,5,6,5,5,5]
*训练的图片张数
NumImages := 8
FirstTrainChar := 0
*一张一张图片训练
for img := 1 to NumImages by 1
    read_image (Image, 'ocr/color_form_0' + img)
    * 
    * Detect foreground
    * 以下的操作是为了从图片中找出数字的像素,去掉多余的影响,比如第一张图我们需要找到00515361这几个数字像素区域,去掉很小即几个字的像素区域
    *图像均值滤波
    mean_image (Image, Mean, 3, 3)
    *分成三通道图像
    decompose3 (Mean, Red, Green, Blue)
    *对绿色通道图像阈值化
    threshold (Green, ForegroundRaw, 0, 220)
    *裁剪区域
    clip_region (ForegroundRaw, Foreground, 3, 3, Height - 4, Width - 4)
    * 
    * Divide colors
    * 
    reduce_domain (Red, Foreground, RedReduced)
    reduce_domain (Green, Foreground, GreenReduced)
    *两图像相减ImageSub=(RedReduced-GreenReduced)*2+128
    sub_image (RedReduced, GreenReduced, ImageSub, 2, 128)
    *滤波
    mean_image (ImageSub, ImageMean, 3, 3)
    *二值化
    binary_threshold (ImageMean, Cluster1, 'smooth_histo', 'dark', UsedThreshold)
    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
    * 
    * Expand Numbers
    * 
    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)
    * 
    * Fine tuning
    * 
    fill_up_shape (Numbers, RegionFillUp, 'area', 1, 100)
    opening_circle (RegionFillUp, FinalNumbersUnsorted, 3.5)
    *排列区域,从上到下,从左到右
    sort_region (FinalNumbersUnsorted, FinalNumbers, 'character', 'true', 'row')
    dev_display (Image)
    dev_display (FinalNumbers)
    *像素个数
    count_obj (FinalNumbers, NumNumbers)
    if (NumNumbers != NumTrainChar[img - 1])
        stop ()
    endif
    * 
    * Write OCR training file
    * 
    rgb1_to_gray (Image, GrayImage)
    Char := TrainChar[FirstTrainChar:FirstTrainChar + NumTrainChar[img - 1] - 1]
    append_ocr_trainf (FinalNumbers, GrayImage, Char, 'ocrcolor.trf')
    FirstTrainChar := FirstTrainChar + NumTrainChar[img - 1]
*     get_mbutton (WindowID, Row, Column, Button)
endfor
dev_update_window ('on')
create_ocr_class_mlp (8, 10, 'constant', 'default', uniq(sort(TrainChar)), 20, 'none', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, 'ocrcolor.trf', 200, 1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, 'ocrcolor')

训练图片

提取到数字信息

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐