Halcon例程分析12:OCR文字识别模型训练
·
打开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')
训练图片

提取到数字信息

更多推荐
所有评论(0)