待识别原图
识别过程:
阈值处理后:
开始分割处理
着色字符:
排序后:
识别结果:
Halcon HDevelop代码:
dev_update_off ()
dev_close_window ()
* read_image (Image, 'ocr/wafer_semi_font_01')
dev_open_window (0, 0, -1, -1, 'black', WindowHandle)
* dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
read_image (Image, 'd:/Desktop/vision/ZN_TXT01.png')
*read_image (Image, 'd:/Desktop/vision/chuanchuan.png')
get_image_size (Image, Width, Height)
*dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
* dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (2)
* dev_set_color ('green')
*dev_set_colored (12)
*以顏色填充方式顯示字符,實心
dev_set_draw ('fill')
* Characters must be black-on-white, i.e., dark characters on a light background
*反转图片,使前景为白色,便于处理
invert_image (Image, ImageInvert)
* mean_image (Image, ImageMean, 31, 31)
* dyn_threshold (Image, ImageMean, RegionDynThresh, 0.1, 'light')
*使用阈值分割,提取前景
threshold (ImageInvert, Region, 155, 255)
* fill_up_shape (Region, RegionFillUp, 'area', 100, 10)
*膨脹,筆畫加粗
* dilation_circle (Region, Reg_dil, 1.5)
*字符筆畫泛暈,加粗筆畫,橫向和豎直方向擴展面積
*將單個字符暈染連成一塊
closing_rectangle1 (Region, RegionClosing1, 12, 27)
* opening_rectangle1 (RegionClosing1, RegionOpening1,1, 3)
* fill_up_shape (RegionClosing1, RegionFillUp, 'area', 100, 10)
*畫個方塊,rad裡面是旋轉角度
gen_rectangle2 (Rectangle, 10, 10, rad(110), 3, 7.3)
*將上面的方塊用於區域的連接
closing (RegionClosing1, Rectangle, RegionClosing2)
*填充算子,將整個字符區域填充
* fill_up(RegionClosing1,RegionFillUp)
* closing_rectangle1 (RegionClosing1, RegionClosing2, 20, 20)
*以9度閉合畫圓圈
closing_circle (RegionClosing2, IntermedCharacters, 9)
connection (IntermedCharacters, ConnPatterns)
*選中區域變形為方形
shape_trans (ConnPatterns, CharBlocks, 'rectangle1')
*这个算子 是根据文字单体大小 用矩形将文字区分开来(为后面求交集做准备)
partition_rectangle (CharBlocks, CharCandidates, 60,150)
*求交集 顏色模塊在前,原字符再后,才能單獨著色交集后的單體字符
intersection (CharCandidates, Region, RegionIntersection)
dev_clear_window()
*dev_clear_obj(CharCandidates)
dev_display(RegionIntersection)
*排序
sort_region (RegionIntersection, FinalCharacters, 'character', 'true', 'row')
dev_display(FinalCharacters)
*-----此行上面识别图片中字符到单字符着色正确-----
*开始训练****************
*计算字符个数
count_obj (FinalCharacters, Number)
*创建训练文件******
*标签
words:=['四','川','省','成','都','市','锦','州','路','达','府','院']
TrainFile:='D:/testWords.trf'
FontFile:='D:/testWords.omc'
dev_set_check('~give_error')
*delete_file(TrainFile)
*dev_set_check('~give_error')
*生成训练文件
for i:=1 to Number by 1
select_obj(FinalCharacters, SingleWord, i)
currentChar:=words[i-1]
append_ocr_trainf(SingleWord,Image,currentChar,TrainFile)
endfor
*读取训练文件
read_ocr_trainf_names(TrainFile, CharacterNames, CharacterCount)
*这里采用halcon预训练模型;第二次及以后训练先将文件名改为FontFile,调用已训练的参数继续训练
*read_ocr_class_mlp('HandWritten_0-9.omc', OCRHandle)
*自己创建神经网络分类器
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
*训练
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
*保存参数到自己命名的分类器文件
write_ocr_class_mlp(OCRHandle, FontFile)
*释放内存
*clear_ocr_class_mlp(OCRHandle)
**------------下面是识别代码---------------------------------------
*開始識別
read_ocr_class_mlp (FontFile, OCRHandle)
do_ocr_multi_class_mlp (FinalCharacters, Image, OCRHandle, Class, Confidence)
*顯示識別的字符到最小的單字符個體矩形左下角
smallest_rectangle1 (FinalCharacters, Row11, Column1, Row2, Column21)
disp_message (WindowHandle, Class, 'image', Row2, Column1+10, 'green', 'false')
*释放内存
clear_ocr_class_mlp(OCRHandle)