下述代码是一个使用HALCON软件编写的OCR(光学字符识别)程序,它主要用于从图像中识别和读取数字。
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 the classifier to use for reading the text.
- It is easiest to use the pre-trained font Industrial_0-9_NoRej. If you
- have run the program ocrcolort.hdev in this directory, you can activate
- the second line to use the font trained with this program.
read_ocr_class_mlp (‘Industrial_0-9_NoRej’, OCRHandle) - read_ocr_class_mlp (‘ocrcolor’, OCRHandle)
- LOOP: Process all Images
NumImages := 8
for img := 1 to NumImages by 1
read_image (Image, ‘ocr/color_form_0’ + img)
*
* Detect foreground
*
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)
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_set_color (‘blue’)
dev_display (Image)
dev_display (FinalNumbers)
count_obj (FinalNumbers, NumNumbers)
union1 (FinalNumbers, NumberRegion)
difference (Image, NumberRegion, NoNumbers)
paint_region (NoNumbers, Green, ImageOCRRaw, 255, ‘fill’)
paint_region (NumberRegion, ImageOCRRaw, ImageOCR, 0, ‘fill’)
*
* OCR
*
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’)
color_form_01.png
color_form_02.png
color_form_03.png
color_form_04.png
color_form_05.png
color_form_06.png
color_form_07.png
color_form_08.png
以下是程序运行结果
以下是代码的主要功能和步骤:
图像读取:使用read_image函数读取名为’ocr/color_form_1’的图像。
图像指针获取:使用get_image_pointer3获取图像的三个颜色通道的指针。
窗口操作:使用dev_close_window关闭当前窗口,然后使用dev_open_window打开一个新的窗口用于显示图像。
图像显示:使用dev_display函数将图像显示在新打开的窗口中。
OCR分类器读取:使用read_ocr_class_mlp函数读取预训练的OCR分类器’Industrial_-9_NoRej’,这个分类器用于识别工业数字。
图像处理循环:通过一个for循环处理多张图像,每张图像的名称格式为’ocr/color_form_’ + img。
前景检测:使用mean_image和threshold函数检测图像中的前景区域。
颜色分割:通过decompose3、reduce_domain和sub_image等函数对图像的颜色通道进行分割和处理。
区域扩展:使用expand_gray_ref函数对数字区域进行扩展,以改善OCR识别的准确性。
形状调整:使用fill_up_shape和opening_circle等函数对数字区域进行形状调整和细化。
数字排序:使用sort_region函数对数字区域进行排序,以便于OCR识别。
OCR识别:使用do_ocr_multi_class_mlp函数对排序后的数字区域进行OCR识别,得到识别结果和置信度。
结果显示:使用disp_message函数在窗口中显示识别结果。
循环控制:在循环的每次迭代结束时,使用disp_continue_message和stop函数等待用户操作,以便继续或停止程序。
资源清理:在循环结束后,使用clear_ocr_class_mlp函数清理OCR分类器资源。
窗口更新:最后,使用dev_update_window函数开启窗口更新,以显示最终的图像结果。
整个程序是一个自动化的OCR流程,用于从特定格式的图像中识别数字,并将识别结果展示给用户。这种类型的程序在工业自动化、数据录入和文档处理等领域有广泛的应用。