标题halcon解决ocr问题的总体思路
一:读取图片,并且对图片进行矫正
二:找到想要进行ocr识别的字符,并且把他们区域话(重点也是难点)
三:进行ocr识别
一:读取图片,并且对图片进行矫正
1.读取图片相对简单,总体思路是读取图片并且设计合适的窗口大小,代码如下:
dev_update_off ()//关闭窗口更新
read_image (Image, 'letters')//读取图片,letters为图片名称
dev_close_window ()//关闭窗口
get_image_size (Image, Width, Height)//获取图片宽高
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)//打开适合图片大小的窗口
dev_set_draw ('fill')//设计区域填充方式
dev_set_colored(12)//区域颜色
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')//设置窗口显示字体
dev_display (Image)//在窗口上显示图片
2.对图片进行矫正,总体有两种图片需要校正,以下分别讲解
(1)倾斜的图片
校正思路:
1.先求一个区域
gen_rectangle1 (ROI_0, 267.5, 381.5, 607.5, 1129.5)
2。根据刚刚所求区域获得倾斜角度
text_line_orientation (ROI_0, Image, 25, -0.523599, 0.523599, OrientationAngle)
3.仿射变换
4.仿射变换作用到图像上
affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'constant', 'false')
对待第3步仿射变换通常有两种方法:
(1)运用旋转矩阵调用hom_mat2d_identity()和hom_mat2d_rotate()两个函数。
//求单位矩阵
hom_mat2d_identity (HomMat2DIdentity)
//根据单位矩阵求旋转矩阵
hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, Px,Py, HomMat2DRotate)
(2)直接进行校正,调用vector_angle_to_rigid()函数。
vector_angle_to_rigid (Width/4, Height/4, OrientationAngle, Width/4, Height/4, 0, HomMat2D)
(2)一个圆环上的给它拉直
校正思路:
1.找到目标区域并且求出它的内外接圆的半径
threshold (GrayImage, Regions, 9, 71)//找到目标区域
shape_trans (Regions, OuterCircle, 'outer_circle')//求出外接圆
complement (Regions, RegionComplement)
connection (RegionComplement, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1.26527e+006, 2.26003e+006)//内接圆区域
smallest_circle (Regions, Row, Column, Radius)//外接圆半径和原点坐标
smallest_circle (SelectedRegions, InRow, InColumn, InRadius)//内接圆半径和原点坐标
2.拉直图像
polar_trans_image_ext (GrayImage, PolarTransImage, Row, Column, rad(60), rad(-300), Radius-5, InRadius+5, 1440, 100, 'nearest_neighbor')
三:找到目标区域
找寻目标区域的方法很灵活,没有办法通用,只能以目标(找到想要进行ocr识别的字符)为导向去进行操作。下面是halcon的ocr实例教程的解法,大家可以参考一下
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)//阈值化
* Connect the i's and j's with their dots
dilation_circle (Region, RegionDilation, 3.5)//膨胀
* Compute the correct connected components
connection (RegionDilation, ConnectedRegions)//区域化
* Reduce each connected component (character) to its original shape
intersection (ConnectedRegions, Region, RegionIntersection)
* Sort the characters line-by-line
sort_region (RegionIntersection, Characters, 'character', 'true', 'row')
dev_display (Characters)
disp_message (WindowHandle, 'Training characters', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
说明:这个很灵活,大家可以多参考halcon的实例教程,作为一名halcon新手,我还没有能力来写(主要见的也不多)
四:进行ocr识别
识别步骤:
1.读取分类器。
2.进行ocr识别
1.读取分类器有两种方式,一种是读取自己生成分类器,另外一种是直接读取系统中的分类器。下边分别对其讲解。
(1)自己生成分类器
*(1)生成trf文件
*初始化准备写入trf文件的内容
count_obj (Characters, Number)
length:=Number/27
Classes:=[]
for Index := 0 to 25 by 1
Classes:=[Classes,gen_tuple_const(length,chr(ord('a')+Index))]
endfor
Classes:=[Classes,gen_tuple_const(length,'.')]
*(2)将内容导入到trf文件夹中,trf文件夹目录已经提前初始化
write_ocr_trainf (Characters, ImageReduced, Classes, TrainFile)
*(3)读取文件内容,为了创建分类器的时候提供要分类的字符
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
*(4)创建分类器
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 20, 'canonical_variates', 26, 42, OCRHandle)
*(5)训练分类器
trainf_ocr_class_mlp (OCRHandle, TrainFile, 100, 0.01, 0.01, Error, ErrorLog)
*找完整的目标区域
full_domain (ImageReduced, ImageFull)
binary_threshold (ImageFull, Region1, 'max_separability', 'dark', UsedThreshold1)
dilation_circle (Region1, RegionDilation1, 3.5)
connection (RegionDilation1, ConnectedRegions1)
intersection (ConnectedRegions1, Region1, RegionIntersection1)
sort_region (RegionIntersection1, Characters, 'character', 'true', 'row')
(2)调用系统的分类器
read_ocr_class_mlp ('Industrial_0-9A-Z_Rej.omc', OCRHandle)
1.进行ocr识别有两种方式。
(1)多个识别
do_ocr_multi_class_mlp (SortedRegions, ImageAffinTrans, OCRHandle, Class, Confidence)
(2)单个识别
for Index := 1 to Number by 1
select_obj (SortedRegions, ObjectSelected, Index)
do_ocr_single_class_mlp (ObjectSelected, ImageInvert, OCRHandle, 1, Class, Confidence)
disp_message (WindowHandle, Class, 'image', MeanRow, Column[Index-1], 'yellow', 'false')
endfor