原文作者:aircraft
原文链接:https://www.cnblogs.com/DOMLX/p/18777081
深度学习教程目录如下,还在继续更新完善中
深度学习系列教程目录
本篇非常简单,但是非常好用的OCR识别,传统的OCR识别方法一大堆各种各样的操作,麻烦的要死。halcon 22版本开始支持深度学习OCR,并且已经提供了训练好的模型,识别率基本可以达到99以上,工业上的一些产品编码,镭克码都可以直接使用。
因为使用比较简单这边直接演示,需要具体看的话可以看一下halcon自带的实例deep_ocr_workflow.hdev
一.代码
省去那些七七八八的预处理,深度学习的OCR其实就是4行代码就可以搞定了:
*深度学习OCR 主要就是
*1.create_deep_ocr创建模型--
*2.set_deep_ocr_param设置某些参数:诸如宽度,高度,字母大小面积等等参数来帮助识别
*3.apply_deep_ocr进行检测--
*4.get_dict_tuple获取检测的结果,然后把这个结果在处理一下就行了
*
这边就是主要读取一张图,然后传入OCR检测模型直接得到结果
1.读取图片(图片可以直接截图,或者下载了拿去用)
2.框选ROI区域
3.得到检测结果显示
dev_clear_window ()
dev_close_window ()
dev_open_window (0, 0, 500, 300, 'green', WindowHandle)
* 获取显示窗口的句柄
dev_get_window (WindowHandle)
* 设置文字的字体和大小
set_font (WindowHandle, 'Courier New-Bold-' + round(26))
*
*深度学习OCR 主要就是
*1.create_deep_ocr创建模型--
*2.set_deep_ocr_param设置某些参数:诸如宽度,高度,字母大小面积等等参数来帮助识别
*3.apply_deep_ocr进行检测--
*4.get_dict_tuple获取检测的结果,然后把这个结果在处理一下就行了
*
create_deep_ocr ('mode', 'recognition', DeepOcrHandle)
*默认使用的是GPU,没有GPU的设置一下CPU运行环境
query_available_dl_devices ('runtime', 'cpu', DLDeviceHandles)
set_deep_ocr_param (DeepOcrHandle, 'device', DLDeviceHandles)*读取一张带字符的图
read_image (Image, '1.png')
*框选一下检测的范围区域
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
*将区域裁剪下来传入检测
crop_rectangle1 (Image, ImagePart, Row1, Column1, Row2, Column2)width:=int(Column2-Column1)
* 设置宽度,高度之类的一些可以辅助增强识别的参数
set_deep_ocr_param (DeepOcrHandle, 'recognition_image_width', width)
*进行深度OCP检测
apply_deep_ocr (ImagePart, DeepOcrHandle, 'recognition', DeepOcrResult)
*获取检测结果
get_dict_tuple (DeepOcrResult, 'word', words)
*打印检测结果
write_string (WindowHandle, words)
set_deep_ocr_param 参数这里可以多辅助一下参数来帮助自己识别检测:
1.detection_image_width,detection_image_height检测区域的宽度,高度
2.detection_min_character_score 最小可容忍的字符识别的分数,就比如你定位一个模板会给出定位的分数1为百分之百匹配,越接近0匹配度越低
3.detection_min_link_score 最小连接分数,这个就关系到字符间距了
4.detection_min_word_area 最小字符面积
5.recognition_num_char_candidates 字符个数
等等,这些参数的设置都可以提高识别的准确率,具体可以看算子里的参数表,不过前提是传进来检测的图片字符已经经过了预处理,先预处理让字符更好的识别,在传入会得到更优秀的准确率。
这里稍微补充一下:
1.就是工业上使用这个OCR识别的一般要跟定位一起,如果你传入的OCR字符都是固定位置就可以直接固定的裁剪,如果是复杂情况的话还需要先分割,如果有不变得模板区域的话,也可以创建个模板匹配,然后基于这个模板的位置反射变换区域的位置过去将字符区域裁剪下来进行识别。
2.得到结果后也许结果里字符需要大小写,或者多出一些干扰,这时候你就可以把那个字符串后期再处理一下,比如里面都是小写的你都改为大写,比如1和i可能识别错误,结合
你的产品看看是否是没有i或者没有1直接遇到就替换,还有0和字符o也是类似的思路。