目录
示例
涉及算子描述
text_line_orientation
hom_mat2d_identity
hom_mat2d_rotate
affine_trans_image
dots_image
reduce_domain
vector_angle_to_rigid
binary_threshold
dilation_rectangle1
union1
shape_trans
partition_rectangle
intersection
partition_dynamic
sort_region
append_ocr_trainf
read_ocr_trainf_names
create_ocr_class_svm
trainf_ocr_class_svm
do_ocr_multi_class_svm
dev_close_window ()
dev_open_window(0, 0, 600, 600, 'black', WindowHandle)
read_image (Image, 'E:/workspace/Halcon/案例/OCR 识别/20190814180102269.png')
disp_message (WindowHandle, '请绘制单个字体最大区域', 'window', 12, 12, 'blue', 'true')
draw_rectangle1 (WindowHandle, Rowh, Columnh, Rowh2, Columnh2)
gen_rectangle1 (Rectangleh, Rowh, Columnh, Rowh2, Columnh2)
fontheight := Columnh2-Columnh
fontweight := Rowh2 - Rowh
dev_clear_window ()
read_image (Image, 'E:/workspace/Halcon/案例/OCR 识别/20190814180102269.png')
* ROI 定位
draw_rectangle1 (WindowHandle, Row, Column, Row2, Column2)
gen_rectangle1 (Rectangle, Row, Column, Row2, Column2)
px := Column + (Column2 - Column)/2
py := Row + (Row2-Row)/2
* ROI 校正
area_center (Rectangle, Area, Row1, Column1)
text_line_orientation (Rectangle, Image, fontheight, -0.523599, 0.523599, OrientationAngle)
*hom_mat2d_identity (HomMat2DIdentity)
*hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, px, py, HomMat2DRotate)
vector_angle_to_rigid (Row1, Column1, OrientationAngle, Row1, Column1, 0, HomMat2DRotate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')
affine_trans_region (Image, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')
* 字符分割
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced1)
dots_image (ImageReduced1, DotImage, 3, 'dark', 0)
threshold (DotImage, Regions, 10, 255)
connection (Regions, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions2, ['row','column'], 'and', [(Row-fontheight),(Column-fontheight)], [Row2+fontheight,(Column2+fontheight)])
* binary_threshold (DotImage, Region, 'max_separability', 'light', UsedThreshold)
*dilation_rectangle1 (Region, RegionDilation, 5, 5)
* 膨胀闭运算
dilation_rectangle1 (SelectedRegions2, RegionDilation, 1, 2.5)
union1 (RegionDilation, RegionUnion)
gen_rectangle2 (Rectangle3, 30, 32, rad(-45), 0, 1)
closing (RegionUnion, Rectangle3, RegionClosing3)
gen_rectangle2 (Rectangle2, 16, 16, rad(45), 0, 1)
closing (RegionClosing3, Rectangle2, RegionClosing2)
gen_rectangle2 (Rectangle3, 16, 16, rad(0), 0, 1)
closing (RegionClosing2, Rectangle3, RegionClosing1)
connection (RegionClosing1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 100, fontweight*fontheight)
* 字符训练识别
partition_dynamic(SelectedRegions, Partitioned, 45, 85)
sort_region (Partitioned, SortedRegions, 'character', 'true', 'row')
*intersection (Partitioned, Region, RegionIntersection)
count_obj (SortedRegions, Number)
dev_display (ImageAffineTrans)
Classes := ['2','0','1','6','0','7','1','3','6','G','1','2','A','1','5','3','6','B']
trainfFile := 'E:/workspace/Halcon/案例/OCR 识别/svm.trf'
for i := 1 to Number by 1
dev_set_color ('red')
select_obj (SortedRegions, Char, i)
intersection (Char, Regions, RegionIntersection)
dev_display (Char)
* 创建分类器进行训练
append_ocr_trainf (RegionIntersection, ImageAffineTrans, Classes[i-1], trainfFile)
endfor
* SVM 分类器分类识别
intersection (SortedRegions, Regions, RegionIntersection2)
dev_display (ImageAffineTrans)
dev_set_colored (6)
read_ocr_trainf_names (trainfFile, CharacterNames, CharacterCount)
create_ocr_class_svm (8, 10, 'constant', 'default', CharacterNames, 'rbf', 0.02, 0.001, \
'one-versus-one', 'normalization', 10, OCRHandle)
trainf_ocr_class_svm (OCRHandle, trainfFile, 0.001, 'default')
do_ocr_multi_class_svm (RegionIntersection2, ImageAffineTrans, OCRHandle, Class)
smallest_rectangle1 (RegionIntersection2, Row11, Column11, Row22, Column22)
for i := 1 to Number by 1
disp_message (WindowHandle, Class[i-1], 'image', Row22[i-1]+100, Column11[i-1]+(Column22[i-1]-Column11[i-1])/2, 'red', 'false')
endfor
clear_ocr_class_svm (OCRHandle)
确定文本行或段落的方向
text_line_orientation (ROI_0, Image, 25, -0.523599, 0.523599, OrientationAngle)
Region 参数指定图像中文本行所在的区域。区域仅用于减少工作面积。为了确定倾斜度,使用该区域内的灰色值;
CharHeight 指定区域 region 中现有文本行的大约高度;
OrientationFrom 和 OrientationTo 的范围应该在 -pi/4 到 pi/4 的区间内;
计算出的角度 OrientationAngle。
生成相同二维变换的齐次变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
对齐次二维变换矩阵添加一个旋转
hom_mat2d_rotate (HomMat2DIdentity, OrientationAngle, 0, 0, HomMat2DRotate)
点(Px,Py)是变换的不动点,即使用HomMat2DRotate进行变换时,该点保持不变;
对齐次二维变换矩阵 HomMat2DIdentity 加上一个角度的旋转,并在HomMat2DRotate中返回得到的矩阵 HomMat2DRotate;
对图像应用任意仿射二维变换
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant','false')
将输入图像 Image 进行仿射 2D 转换,输出转换后的图像 ImageAffineTrans;
通过输入的 HomMat2DRotate 给出的同次变换矩阵描述,以插值的类型('bicubic', 'bilinear', 'constant', 'nearest_neighbor', 'weighted')(默认 constant)对图像结果调整大小确认(默认 false)。
点图像
dots_image (ImageAffineTrans, DotImage, 11, 'dark', 0)
增强输入图像中直径的圆形圆点;
将输入图像进行点圆形直径增加 Diameter (默认为 5);
FilterType 选择图像中的“暗点”、“亮点”或“所有”点是否应该增强;
PixelShift 既可以用来增加输出图像的对比度(PixelShift > 0),也可以用来抑制将被切断的极亮区域的值(PixelShift = -1)。
缩小图像的域
reduce_domain (DotImage, ROI_0, ImageReduced)
将给定图像的定义域缩小到指定的区域;
新的定义域计算为旧定义域与区域的交集。
新的定义域可以是区域的子集。矩阵的大小没有改变。
从点和角度计算刚性仿射变换
vector_angle_to_rigid (Row1,Column1,OrientationAngle, Row1,Column1,0, HomMat2D)
计算一个刚性仿射变换,即一个由旋转和平移组成的变换,从一个点对应关系和两个对应角度出发,返回齐次变换矩阵 HomMat2D;
原点的坐标 (Row1,Column1) 和对应角度 OrientationAngle,转换点的坐标 (Row2,Column2)和对应的角度 Angle2。
使用二进制阈值分割图像
binary_threshold (DotImage, Region, 'max_separability', 'light', UsedThreshold)
使用自动确定的全局阈值分割单通道图像,并在 region 中返回分割的区域;
'max_separability'和'smooth_histo'。这两种方法只能用于具有双峰直方图的图像;
分割方法 'smooth_histo' 提供的功能与操作符 bin_threshold 提供的功能相同;
分割方法 'max_separability' 倾向于为 UsedThreshold 确定较小的值;
'LightDark' 为提取的前景或背景(默认 'dark')。
使用矩形结构元素扩展区域
dilation_rectangle1 (Region, RegionDilation, 11, 11)
返回所有输入区域的联合
union1 (RegionDilation, RegionUnion)
变换区域的形状
shape_trans (ConnectedRegions, RegionTrans, 'rectangle1')
将一个区域划分成大小大致相等的矩形
partition_rectangle (SelectedRegions, Partitioned, 45, 85)
计算两个区域的交点
intersection (Partitioned, Region, RegionIntersection)
在垂直范围较小的位置上水平划分区域
partition_dynamic(SelectedRegions, Partitioned, 45, 85)
将输入区域水平划分为距离宽度近似的区域,当输入区域宽度大于1.5倍距离时,才进行分区;
Distance 为所得到的的结果区域部分的近似宽度;
Percent 分割位置的最大移动百分比。
根据区域的相对位置对区域进行排序
sort_region (Partitioned, SortedRegions, 'first_point', 'true', 'row')
SortMode 排序模式:'character', 'first_point', 'last_point', 'lower_left', 'lower_right', 'upper_left', 'upper_right',默认为 'first_point';
Order 递增(true)或递减(false)排序顺序,按行(row)或列(column)进行排序。
将字符添加到训练文件
append_ocr_trainf (RegionIntersection,ImageAffineTrans, Classes[i-1],'/svm.rtf')
操作符 append_ocr_trainf 用于使用操作符 trainf_ocr_class_mlp 或 trainf_ocr_class_svm 来准备训练;
表示字符的区域,包括其灰度值(区域和像素)和对应的类名将被写入文件(追加写);
character 中每个字符(区域) RegionIntersection 必须在 class 中指定相应类名 Classes;
灰度值通过参数 Image (ImageAffineTrans)传递。
查询那些字符存储在训练文件中
read_ocr_trainf_names (trainfFile, CharacterNames, CharacterCount)
使用支持向量机创建一个OCR分类器
create_ocr_class_svm (8, 10, 'constant', 'default', CharacterNames, \
'rbf', 0.02, 0.001, 'one-versus-one', 'normalization', \
10, OCRHandle)
分割字符的灰度值被放大到的矩形的宽度 WidthCharacter(默认 8)、高度(默认 10);
Interpolation 用于字符缩放的插值模式('bicubic', 'bilinear', 'constant'(默认), 'nearest_neighbor', 'weighted');
Features 用于分类的特征(默认 'default');
CharacterNames 要读取的字符集的所有字符,内核类型默认 'rbf'( 'linear', 'polynomial_homogeneous', 'polynomial_inhomogeneous', 'rbf');
内核函数的附加参数(默认 0.02),SVM的正则化常数(0.001),SVM 的模式('one-versus-all', 'one-versus-one');
Preprocessing 用于变换特征向量的预处理类型('canonical_variates', 'none', 'normalization', 'principal_components');
预处理参数NumComponents : 转换后的特征的数量( Preprocessing = 'none' 和 'normalization' 时忽略),默认 10。
训练一个 OCR 分类器
trainf_ocr_class_svm (OCRHandle, trainfFile, 0.001, 'default')
用 TrainingFile 给出的 OCR 训练文件 trainfFile 中存储的训练字符训练 OCR 分类器OCRHandle;
训练停止参数(默认 0.001),训练模式('add_sv_to_train_set', 'default')。
使用基于 SVM 的 OCR 分类器对多个字符进行分类
do_ocr_multi_class_svm (RegionIntersection2, ImageAffineTrans, OCRHandle, Class)