一、步骤
1. 创建训练文件,将文字图像与文字分类标识关联,保存到训练文件中,训练文件后缀名为trf,主要用到函数为append_ocr_trainf。
2. 训练OCR分类器,Halcon支持BOX分类器、神经网络分类器(MLP)和支持向量机分类器(SVM),由于后两者比前者更加强大,推荐使用后两者。训练分类器非常简单,首先调用create_ocr_class_mlp或create_ocr_class_svm创建分类器,然后调用trainf_ocr_class_mlp或trainf_ocr_class_svm训练分类器,用write_ocr_class_mlp或write_ocr_class_svm可以保存训练结果。
3. 测试分类器,读入图像,如要文字不是水平,应将其旋转成水平,可以使用以下函数:
text_line_orientation计算文字倾角,rotate_image旋转图像。注意前者使用的是弧度,后角使用的是度。分割文字。读取分类器read_ocr_class_mlp,即读取训练分类器的结果。使用do_ocr_multi_class_mlp对文字进行识别。
二、 参考实例
为方便起见,这里将三个步骤放在一个实例里,也可以分别将三个步骤保存成三个独立的程序。
(1)创建训练文件
1.1 分割字符
dev_close_window()
read_image(Image,'F:/学习资料/Halcon工程/ocr-train.bmp') get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
threshold(Image, Region, 0, 100)
connection(Region, ConnectedRegions)
sort_region (ConnectedRegions, SortedRegions, 'upper_left', 'true', 'column') count_obj(SortedRegions, Number) for Index := 1 to Number by 1
dev_clear_window()
select_obj(SortedRegions, SingleWord, Index)
dev_display(SingleWord)
stop()
endfor
1.2文字分类标识
words:=['a','b','c','d','e','f','g']
1.3 创建训练文件
TrainFile:='words.trf'
dev_set_check('~give_error')
delete_file(TrainFile)
dev_set_check('~give_error')
1.4 将图像字符与字符标识关联,保存到训练图像中
for i:=1 to Number by 1
select_obj(SortedRegions, SingleWord, i)
append_ocr_trainf(SingleWord,Image,words[i-1],TrainFile)
endfor
(2)训练OCR
2.1 确定字体文件名
FontFile:='words.omc'
2.2 得到字符标识名
read_ocr_trainf_names(TrainFile, CharacterNames, CharacterCount)
2.3 确定神经网络隐藏层节点数
NumHidden:=20
2.4 创建神经网络分类器
create_ocr_class_mlp(8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
2.5 训练神经网络
trainf_ocr_class_mlp(OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
2.6 保存训练结果
write_ocr_class_mlp(OCRHandle, FontFile)
2.7 清除句柄
clear_ocr_class_mlp(OCRHandle)
(3)识别文字
3.1 读入图像
dev_close_window()
read_image(Image,'F:/学习资料/Halcon工程/ocr-read.bmp') get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle) dev_display(Image)
3.2 对齐文字
text_line_orientation(Image, Image, 25, rad(-45), rad(45), OrientationAngle) rotate_image(Image, ImageRotate, -OrientationAngle/rad(180)*180, 'constant')
3.3 分割文字
threshold(ImageRotate, TestWordsRegion, 0,100) connection(TestWordsRegion, TestSingleWords)
select_shape (TestSingleWords, SelectedRegions, 'area', 'and', 80, 500)
sort_region (SelectedRegions, TestWordsSortedRegions, 'upper_left', 'true', 'column') count_obj(TestWordsSortedRegions, Number) read_ocr_class_mlp(FontFile, OCRHandle1)
do_ocr_multi_class_mlp(TestWordsSortedRegions, ImageRotate, OCRHandle1, Class, Confidence)
for Index := 1 to Number by 1
dev_display(ImageRotate)
select_obj(TestWordsSortedRegions, ObjectSelected, Index)
dev_display(ObjectSelected)
disp_message(WindowHandle, Class[Index-1], 'image', 12, 20*Index, 'green', 'true')
stop()
endfor
clear_ocr_class_mlp (OCRHandle1)