OCR识别中级篇,Halcon实战项目讲解三,数显屏OCR识别
Halcon程序及其讲解。
个人学习笔记
read_image (Image, ‘D:/shijue/学习笔记/OCR识别/OCR识别2.png’)
mirror_image (Image, ImageMirror, ‘row’)
mirror_image (ImageMirror, ImageMirror1, ‘column’)
*旋转摆正
*镜像翻转
scale_image (ImageMirror1, SelectedChannel, 4.47368, -886)
*灰度直方图,缩放
*预处理
threshold (SelectedChannel, Regions, 0, 5)
*二值化
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 38942.3, 82211.5)
reduce_domain (ImageMirror1, SelectedRegions, ImageReduced)
threshold (ImageReduced, Regions1, 0, 128)
connection (Regions1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, [‘width’,‘height’,‘column’,‘row’], ‘and’, [7.236,8.56,467.79,522.6], [44.687,175.67,1000,1000])
union1 (SelectedRegions1, RegionUnion)
gen_rectangle2 (Rectangle, 16, 16,rad(145), 5, 0)
closing (RegionUnion, Rectangle, RegionClosing)
gen_rectangle2 (Rectangle1, 16, 16, rad(45), 5, 0)
closing (RegionClosing, Rectangle1, RegionClosing1)
- dilation_rectangle1 (RegionUnion, RegionDilation, 8,8)
connection (RegionClosing1, ConnectedRegions2)
intersection (ConnectedRegions2, Regions1, RegionIntersection)
*取交集
read_ocr_class_mlp (‘Industrial_0-9_NoRej.omc’, OCRHandle)
*工业字体
do_ocr_multi_class_mlp (RegionIntersection, ImageReduced, OCRHandle, Class, Confidence)
*Confidence,信任度
smallest_rectangle1 (RegionIntersection, Row11, Column1, Row2, Column21)
dev_display (ImageMirror1)
dev_get_window (WindowHandle)
disp_message (WindowHandle, Class, ‘image’, Row2, Column1, ‘green’, ‘false’)
stop ()
实现效果
单步具体讲解:
read_image (Image, ‘D:/shijue/学习笔记/OCR识别/OCR识别2.png’)
//image助手读图
mirror_image (Image, ImageMirror, ‘row’)
//进行垂直翻转
mirror_image (ImageMirror, ImageMirror1, ‘column’)
//进行横向翻转。
//由于初始的图片为倒立状态所以我们对图像进行2次翻转后得到正向图片。
//在halcon中,OCR的分类器是有着固定的形态的,OCR分类器的识别必须需要字符处于横向水平的状态,且是正立,较为清晰的情况才可以调用OCR分类器识别。
scale_image (ImageMirror1, SelectedChannel, 4.47368, -886)
//灰度直方图缩放。在对于灰度图像的时候,可以使用缩放直接对灰度直方图进行选择。缩放采取的是识别图像像素与像素之间的灰度差距,如果存在灰度差距非常大的图像,则可以直接使用缩放进行选取。
threshold (SelectedChannel, Regions, 0, 5)
//对缩放后的图像继续灰度直方图阀值选择,由于进行过缩放后的图像的灰度阀值会形成阶段化
//可以快速的对所需要的区域进行选取
connection (Regions, ConnectedRegions)
//断开
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 38942.3, 82211.5)
//进行特征选择,可以直接选择到液晶屏的区域
reduce_domain (ImageMirror1, SelectedRegions, ImageReduced)
//对区域进行裁剪
threshold (ImageReduced, Regions1, 0, 128)
//使用直方图对大面积不需要的区域进行去除,在去除过程中需要保持数字的完整
connection (Regions1, ConnectedRegions1)
//断开
select_shape (ConnectedRegions1, SelectedRegions1, [‘width’,‘height’,‘column’,‘row’], ‘and’, [7.236,8.56,467.79,522.6], [44.687,175.67,1000,1000])
//特征选择。Width:一定宽度。Height:一定高度。Column:横向距离。Row:纵向距离。多重选择可以直接保证可以顺利选取到数字
union1 (SelectedRegions1, RegionUnion)
//将所以区域形成统一连通域
//由于我们识别到字符并不是一个连接的字符,而是多个区域的字符所以我们需要将单个字符进行相连。
gen_rectangle2 (Rectangle, 16, 16,rad(145), 5, 0)
//建立连接段。Rectangle:输出图像。16, 16,:横向与纵向像素,为你需要填充的像素且填充的像素为16*16的矩形一定角线,rad(145):角度。5:宽度大小。0:高度大小。
//一般情况我们只需要填角度,宽度,横向,纵向4个元素,高度大小一般不用
closing (RegionUnion, Rectangle, RegionClosing)
//进行闭运算。RegionUnion输入图像,Rectangle添加图像,RegionClosing,输出图像。
gen_rectangle2 (Rectangle1, 16, 16, rad(45), 5, 0)
closing (RegionClosing, Rectangle1, RegionClosing1)
- dilation_rectangle1 (RegionUnion, RegionDilation, 8,8)
//对于正常情况的OCR识别而言,到上面的步骤我们仍然可以直接通过膨胀解决,但是如果存在膨胀效果不佳的时候可以选择上面的添加区域然后进行闭运算。
connection (RegionClosing1, ConnectedRegions2)
//断开
intersection (ConnectedRegions2, Regions1, RegionIntersection)
//取交集。仍然需要注意的是,去交集一定要与上面二值化后面的图像进行取交集。因为,二值化后面的所有步骤都是为了找到字符所在的位置
read_ocr_class_mlp (‘Industrial_0-9_NoRej.omc’, OCRHandle)
//读取分类器,注意应该选择工业字体
do_ocr_multi_class_mlp (RegionIntersection, ImageReduced, OCRHandle, Class, Confidence)
//对所有字符进行一次识别。RegionIntersection :输入图像。ImageReduced :二值化区域图像,OCRHandle :分类器句柄。Class :字符存放数组。Confidence:信任度。
//显示
smallest_rectangle1 (RegionIntersection, Row11, Column1, Row2, Column21)
dev_display (ImageMirror1)
dev_get_window (WindowHandle)
disp_message (WindowHandle, Class, ‘image’, Row2, Column1, ‘green’, ‘false’)
总结:仍然是OCR识别的常规套路。
第一步:摆正图像
第二步;提取区域
第三步:提取字符所在区域
第四步:将提取的字符所在区域和提取到的区域进行取交集
第五步:读取分类器,识别输出。