第一讲

OCR:(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。
摘自百度百科
这一部分我们主要利用letter_mlp的例程进行分析, 这个例程展示了怎样实现一个简单的OCR分类器,下面进行逐句解读。
首先我们要创建一个分类器是用于训练的,按照训练的思路,第一步就是要有训练字符,第二步是要知道训练字符的标签,第三步才是进行训练。下面我们一步一步来实现。

第一步:读取图片和显示图片,并获取图片参数,主要是长和宽,这里dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)表示打开一个适应图像尺寸的窗口,并设置颜色,获取图片路径之后定义训练文件名。

* This example program shows how to use a simple MLP OCR classifier
*
dev_update_off ()
read_image (Image, 'letters')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_colored (12)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
get_tmp_dir (TmpDir)
TrainFile := TmpDir + '/letters.trf'
dev_display (Image)

执行这一段代码之后得到

第二步:形成训练数据。
生成一个矩形区域,并与原图做差,即从原图中分割出这个区域的内容作为训练数据

gen_rectangle1 (Rectangle, 0, 0, Height - 1, 400)
reduce_domain (Image, Rectangle, Image)
* Segment the image

接着执行这一段代码得到以下内容,即从原图中分割出该矩形区域的内容。

第三步:对训练数据分割并排序
加下来对分割下来的部分进行处理。首先进行快速二值化binary_threshold,(快速二值化一般用于背景简单的内容)需要注意的是,快速二值化的参数dark表示需要处理的部分为黑色。由于字母ij为两个部分组成,所以需要先进行膨胀dilation_circle,使其成为一个连通域之后再进行打散操作connection,然后通过求交集intersection的方式,将膨胀后的字母还原成原来的大小。注意,在求交集运算中,即使最终ij上的点没有与下面连接,依然是一个连通域,打散之后进行排序操作sort_region,这里选用按字符行排列。

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 ()

运行以上代码得到

第四步:建立图片字符与理论字符的关联文件
先计算字符个数、训练数据每一行的长度,定义数组Classes,用于存储字母a ~ .ord('a') + j表示将a转成ASCII编码后加j表示其他字母的ASCII编码,chr(ord('a') + J))表示将ASCII编码转化为字符,gen_tuple_const(Length,chr(ord('a') + J))表示生成Length长的该字符tuplewrite_ocr_trainf (Characters, Image, Classes, TrainFile)表示将Image中的训练字符charactersClasses一一关联,存储在文件TrainFile中。

* Compute the true class of each character
count_obj (Characters, Number)
Length := Number / 27
Classes := []
for J := 0 to 25 by 1Classes := [Classes,gen_tuple_const(Length,chr(ord('a') + J))]
endfor
Classes := [Classes,gen_tuple_const(Length,'.')]
* Construct the necessary training file from the segmented characters
write_ocr_trainf (Characters, Image, Classes, TrainFile)

执行得到Classes数组的内容

至此,Classes数组与图片中的字符建立关联,关联文件为TrainFile。可以借助OCR训练文件浏览器查看,这里在汉字识别部分会进行补充。

第五步:训练OCR分类器
读取训练文件TrainFile,使用多层感知器创建一个OCR分类器create_ocr_class_mlp,配置如下:

使用MLP训练一个OCR分类器trainf_ocr_class_mlp,设置训练参数,即最大迭代次数、权重和容错率

* Create the classifier.  We read out the classes from the train file.
* Therefore, the training part of the program is generic and can be
* used to train any OCR classifier.
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 20, 'normalization', 26, 42, OCRHandle)
* Train the classifier
trainf_ocr_class_mlp (OCRHandle, TrainFile, 100, 0.01, 0.01, Error, ErrorLog)
*

执行至此,我们已经完成了一个OCR分类器的训练,下面进行测试。

第六步:测试
首先扩展图片,full_domain,输入一个矩形,其边长为图像的新定义域。这意味着矩阵的所有像素都包含在进一步的操作中。因此,通过读取或生成图像来获得相同的定义域。矩阵的大小不会改变。
然后进行快速二值化等处理,这一步操作与第二步类似,不加赘述。
接下来使用刚刚训练的OCR分类器进行测试do_ocr_multi_class_mlp,对Image中排好序的Characters利用刚刚训练的OCR分类器,句柄为OCRHandle进行测试,测试结果为Class,精度为Confidence

* Now test the classifier on the whole training image
full_domain (Image, Image)
* Segment characters the same way as before
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold1)
dilation_circle (Region, RegionDilation, 3.5)
connection (RegionDilation, ConnectedRegions)
intersection (ConnectedRegions, Region, RegionIntersection)
sort_region (RegionIntersection, Characters, 'character', 'true', 'row')
* Classification
do_ocr_multi_class_mlp (Characters, Image, OCRHandle, Class, Confidence)
*

执行至此,可以看到控制变量窗口处的Class变量为

完成此次OCR训练器的测试

第七步:显示
首先测得每个字符的面积、行、列,设置显示字体,显示Class的内容。

* Display results
area_center (Characters, Area, Row, Column)
dev_display (Image)
set_display_font (WindowHandle, 16, 'sans', 'true', 'false')
disp_message (WindowHandle, Class, 'image', Row - 16, Column + 8, 'blue', 'false')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
disp_message (WindowHandle, 'Classification result', 'window', 12, 12, 'black', 'true')
dev_set_check ('~give_error')
delete_file (TrainFile)
dev_set_check ('give_error')

执行至此,可以看到训练结果

总结
这个简单的OCR识别例程就分析到这里,首先要得到单个的训练数据,然后创建分类器,训练分类器,最后测试并显示。

Halcon学习笔记(八)——OCR初步创建并训练OCR分类器相关推荐

  1. Halcon 学习笔记八:颜色识别

    Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...

  2. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  3. ROS学习笔记八:创建ROS msg和srv

    ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...

  4. Halcon学习笔记(五)几何定位+仿射+车牌识别

    定位 Blob分析 模板匹配 仿射 使用单位矩阵求仿射矩阵 示例:affine_trans_region.hdev 单位矩阵 hom_mat2d_identity (HomMat2DIdentity) ...

  5. Halcon学习笔记(三)---数据类型

    Halcon学习笔记(三)---数据类型 halcon只能在单独行进行注释,不能在语句后面进行注释. 1.tuple(元组,重数) 赋值符号":=" tuple算子: (1)变量定 ...

  6. Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)

    Halcon学习笔记:select_points_object_model_3d 3D对象模型阀值分割 This example program shows how to use the operat ...

  7. Halcon学习笔记:xyz_attrib_to_object_model_3d示例

    Halcon学习笔记:xyz_attrib_to_object_model_3d--从X.Y和Z图像中创建3D对象模型同时附加属性 xyz_attrib_to_object_model_3d.hdev ...

  8. Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例

    Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为: 获取图像 对图像进行灰度值标定 (针对相机获取的图像灰度和输入能量之间的非线性关系, ...

  9. Halcon学习笔记:3D_coordinates(3D标定)

    Halcon学习笔记:3D_coordinates(3D标定) 欢迎有兴趣的朋友一起学习,代码理解注释有问题的可以告诉我,一起讨论,共同进步. *初始化程序,dev_close_window() *关 ...

最新文章

  1. 实现800*600,1024*768两套分辨率方案
  2. K单体型重建算法的研究
  3. spring 依赖注入的3种方式
  4. Envoy实现.NET架构的网关(三)代理GRPC
  5. tail -f 查找关键字_C语言九种查找算法 | 总有一款适合你
  6. android 后台耗时,android教程之使用asynctask在后台运行耗时任务
  7. php后台登陆页面代码
  8. netperf网卡测速ubuntu linux 环境下测硬件网卡速度
  9. discuz左边用户信息框美化代码分享
  10. Qt 中使用librdkafka librdkafka++ 创建消费者
  11. 利用js书写正三角形
  12. 7 年 Python 的我,总结了这 90 条写 Python 程序的建议
  13. Variation information(信息差异指标)
  14. HTTP response codes
  15. WPF的Shape(形状)、Path(路径)、Drawing(图画)、Visual(可视化对象)
  16. 开源软电话 (Open Source Soft Phones)
  17. 教程:游戏LOGO=游戏符号+名字
  18. Set接口下的三个实用类
  19. ant design vue时间范围(range-picker)自定义时间段范围
  20. Gta4 微软服务器,R星发布《GTA4》Win10补丁 业界良心从不令人失望

热门文章

  1. oracle 表锁住
  2. 理解一维数组中buf\buf[0]\buf[0]\buf四个符号的含义
  3. 三分靠策略 七分靠执行
  4. 使用野狗(Wilddog)云setValue写入数据
  5. 使用mybatis分页插件报错Error parsing SQL Mapper Configuration; Cause: java.lang.ClassCastException: com.gith
  6. blender学习笔记(环形阵列几种做法)
  7. 2023年中国软件开发公司排行榜最新名单排名
  8. OpenOffice在线预览附件
  9. css3盒子模型微课_css3 盒模型记
  10. 两个div横向排列,顶端对齐的方式。