Halcon Ocr识别学习 第一节

Halcon Ocr识别学习 第一节

简介:通过halcon实现ocr识别,嵌入到VC里,实现调用。
VC只是一个开发环境(舞台),C++是语言,OpenCV和halcon相当于舞台的道具

OpenCV和halcon的区别:OpenCV是一个库,包含各种算子,需要在VC里配置(告诉连接器和编译器当前的位置,动态调用库的算子);halcon自带环境,需要在VC里配置,VC也是调用它的库,导出相应语言。

模式识别在图像处理的基础上加入了图像理解,分类器的训练需要提取图像的特征点,分类器的种类有神经网络训练器,SVM训练器等。

1.在Halcon实现OCR的训练和识别

1)训练代码如下:

dev_close_window () //首先关闭窗口
dev_open_window (0, 0, 640, 400, 'black', WindowHandle)  //打开一个新的窗口(横坐标,纵坐标,宽度,高度,背景颜色,句柄)
read_image (Image, 'D:/2.bmp')  //读取图像(变量,图像的路径)
get_image_size (Image,Width,Height) //得到图像的宽度和高度(单位是像素),显示在变量窗口中

Classes:=['2','0','1','6','0','7','1','3','6','6','1','2','A','1','5','3','6','B']//人工对应,相当于赋值

Row1 :=281.1
Column1 :=377.5
Row2 :=562.7
Column2 :=1065.5 //这些是ROI坐标,目的是制造一个矩形区域,方便接下来的区域内字符的旋转
Px :=Column1+(Column2-Column1)/2
Py :=Row1+(Row2-Row1)/2
gen_rectangle1 (Rectangle1,Row1,Column1,Row2,Column2)//形成一个矩形区域
*旋转
text_line_orientation(Rectangle1, Image, 75, -0.523599, 0.523599, OrientationAngle)//将图像内的文本信息进行旋转,得到旋转角度,75是字符的高度
hom_mat2d_identity (HomMat2DIdentity) // 生成一个2D单位矩阵
hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, Px, Py, HomMat2DRotate)//生成旋转矩阵
affine_trans_image (Image, Rotated, HomMat2DRotate, 'constant', 'false')//仿射变换,旋正

dots_image (Rotated, DotImage, 15, 'dark', 0)//提取暗点
gen_rectangle1 (ROI_0, 281.1, 377.5, 562.7, 1065.5)//ROI区域
reduce_domain (DotImage, ROI_0,  ImagePart)//提取区域中的内容
threshold(ImagePart,Region,75,255)//二值化,可以用灰度直方图调整阈值
*  binary_threshold (ImageReduced, Region, 'max_separability', 'light', UsedThreshold)//快速二值化

connection (Region, ConnectedRegions1) //把一个个点连接起来,形成一个连通域
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 4, 500)//选择面积,选择所需要的形状大小
union1 (SelectedRegions1, RegionUnion) //单元联合,形成一个块

*闭运算目的把点连起来,形成连通域,容易图像分割
closing_rectangle1(RegionUnion, RegionClosing1, 10,10)//第一次
closing_rectangle1(RegionClosing1, RegionClosing2, 10, 10)//第二次
gen_rectangle2 (Rectangle, 16, 16, rad(45), 7, 0)//形成一个矩形区域
closing(RegionClosing2,Rectangle,RegionClosing3)//闭运算

gen_rectangle2 (Rectangle, 2, 2, rad(145), 8, 0)
closing(RegionClosing3,Rectangle,RegionClosing4)
dilation_circle(RegionClosing4,RegionDilation,6)//膨胀,为了更好地连接,6为半径

connection(RegionDilation,ConnectedRegions) //把一个个点连接起来,形成一个连通域

shape_trans(ConnectedRegions, RegionTrans, 'rectangle1')

select_shape (ConnectedRegions, SelectedRegions, ['width','height'], 'and', [0,23.168], [200,200])//选择需要的图形
partition_rectangle (SelectedRegions, CharCandidates, 43, 80)//矩形分割

intersection(CharCandidates, Region, RegionIntersection1)//找交集,把字符一个一个都提出来

sort_region(RegionIntersection1, SortedRegions, 'character', 'true', 'row')//按字符递增行排序
count_obj(SortedRegions,NumIntermediate)//计算连通域的数量
dev_display(Rotated)//显示旋转后的图像
for i:=1 to NumIntermediate by 1
    dev_set_color('red')
    select_obj(SortedRegions,Char,i)
    dev_display(Char)
    intersection(Char,Region,Character)
    append_ocr_trainf(Character,Rotated,Classes[i-1],'D:/svm.trf')//形成文件
endfor

2)识别代码如下:

intersection(SortedRegions,Region,Characters)//求交集
dev_display(Rotated)//显示旋转后的图像
dev_set_colored(6)
dev_display(Characters)

read_ocr_trainf_names('D:/svm.trf',CharacterNames,CharacterCount)//读取训练的文件
create_ocr_class_svm(8,10,'constant','default',CharacterNames,'rbf',0.02,0.09,'one-versus-one', 'normalization', 10, OCRHandle)//创建
trainf_ocr_class_svm (OCRHandle, 'D:/svm.trf', 0.001, 'default')//训练
do_ocr_multi_class_svm (Characters, Rotated, OCRHandle, Class)//识别
smallest_rectangle1(Characters,Row1, Column1, Row2, Column2)//最小外接矩形
for i:=1 to NumIntermediate by 1
    disp_message(3600,Class[i-1],'image',Row2[i-1]+100,Column1[i-1],'red','false')//显示字符
endfor
clear_ocr_class_svm(OCRHandle)
stop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值