通过此例程的学习主要学会了一般字符识别的流程 主要是:图像预处理----字符分割---字符识别
本例程主要难点在与字符分割方面,例程很好的展示了如何对未知字符,位置间隔等不均匀,位置不确定的字符如何提取
本次例程运行opening_circle,opening_rectangle1,intersection完成字符的定位于分割。算子本身运用简单,但是要进行完美的结合,运用才能产生威力。
后续学习中,更加需要注意算子之间的结合运用思路。后续将会研究规则粘字字符均匀的分割方法,如车牌,有明显的特征区域,提取特征区域后,字符是均匀分布在这个区域中,根据此先验知识来完成字符的分割。
FontName := 'Industrial_0-9'
* FontName := 'bottle'
*
* Step 1: Segmentation
read_image (Bottle, 'bottle2')
get_image_size (Bottle, Width, Height)
dev_close_window ()
dev_open_window (0, 0, 2*Width, 2*Height, 'black', WindowID)
stop ()
threshold (Bottle, RawSegmentation, 0, 95)
*填充小的噪点
fill_up_shape (RawSegmentation, RemovedNoise, 'area', 1, 5)
*作圆形的开运行算 保留大面积区域,消除不感兴趣区域
opening_circle (RemovedNoise, ThickStructures, 2.5)
dev_display (Bottle)
dev_set_color ('green')
dev_display (ThickStructures)
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Bottle)
dev_display (ThickStructures)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*填充感兴趣区域 为后面的opening做准备,
fill_up (ThickStructures, Solid)
dev_display (Bottle)
dev_display (Solid)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*巧妙运行开运算将连接字符分开 如01将被分开,(先填充再开运算 巧妙运用了字符自身特点)
opening_rectangle1 (Solid, Cut, 1, 7)
dev_display (Bottle)
dev_display (Cut)
disp_continue_message (WindowID, 'black', 'true')
stop ()
connection (Cut, ConnectedPatterns)
*再与未被处理的图像进行区域求交集 恢复被填充后的字符
intersection (ConnectedPatterns, ThickStructures, NumberCandidates)
dev_set_colored (12)
dev_display (Bottle)
dev_display (NumberCandidates)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*根据面积选取字符区域
select_shape (NumberCandidates, Numbers, 'area', 'and', 300, 9999)
sort_region (Numbers, FinalNumbers, 'first_point', 'true', 'column')
dev_set_color ('red')
dev_display (Bottle)
dev_display (Numbers)
dev_set_shape ('rectangle1')
dev_set_color ('green')
dev_display (FinalNumbers)
dev_set_shape ('original')
dev_set_line_width (1)
dev_set_draw ('fill')
*
* Step2: Reading
*读取训练后的字
read_ocr_class_mlp (FontName, OCRHandle)
*ocr进行识别
do_ocr_multi_class_mlp (FinalNumbers, Bottle, OCRHandle, RecNum, Confidence)
*获得每个字符的中心位置,方便后续的识别字符显示
area_center (FinalNumbers, Area, Row, ColNum)
set_display_font (WindowID, 27, 'mono', 'true', 'false')
for i := 0 to |RecNum|-1 by 1
disp_message (WindowID, RecNum[i], 'image', 80, ColNum[i]-3, 'green', 'false')
endfor
clear_ocr_class_mlp (OCRHandle)
dev_update_window ('on')