首页 > 其他分享 >Halcon的学习笔记(一)——非线性字符识别

Halcon的学习笔记(一)——非线性字符识别

时间:2024-07-18 10:54:36浏览次数:19  
标签:字符 字符识别 例程 非线性 SelectedRegions Halcon 区域 图像

Halcon 非线性模式的字符识别(ocr_cd_print_polar_trans.hdev例程分析)

Halcon的学习笔记(一)——非线性字符识别

项目上需要对非线性模式的字符进行识别,halcon中包含的例程,我搜了一下,网上对于该例程的解析比较少,因此自己便记录了一下自己的学习例程,也算自己的学习笔记。

1. 什么是非线性字符识别?

字符排列整齐的前提下,识别只需要按照固定的方向即可完成对应的字符识别,然而并不是所有的字符都是符合上述排序方式的。其中有一部分是按照圆形、螺旋、锯齿等不规则模式进行排序的,那么此时就需要一些特殊的处理方式了。

图像来源于halcon例程图像来源于halcon例程

2. 图像预处理

先将包含待检测的字符区域的圆环提取出来:

* 均值滤波后与原图进行动态阈值分割,凸显出圆边缘
mean_image (Image, ImageMean, 211, 211)
dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'dark')
connection (RegionDynThresh, ConnectedRegions)
* 选择区域面积最大的区域
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
* 区域转换成轮廓并且进行拟合,拟合后以拟合圆心生成半径不同的同心圆
gen_contour_region_xld (SelectedRegions, Contours, 'border')
fit_circle_contour_xld (Contours, 'ahuber', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle (CircleO, Row, Column, Radius - 5)
gen_circle (CircleI, Row, Column, Radius - 30)
* 再将两个区域求差集获得圆环区域
difference (CircleO, CircleI, Ring)

到了这一步基本上完成了区域提取,提取这个圆环区域“Ring”有什么用呢?我们往下看(好吧,这个其实作用不大,只是display作用,后续展开的图像“高”是这个玩意儿,就类似于圆环彩纸剪开成矩形的那个“宽”)。

3. 图像极坐标转换

图像极坐标系转换原理请参考这篇文章,里面包含opencv的实现方式,能够更好的帮助理解 http://t.csdnimg.cn/XrUx7
其大致的意思比较简单如下图所示:
在这里插入图片描述
(上述图仅为个人对极坐标转换的理解,本人的表述可能存在一定问题,如果有问题还请大佬指正,谢谢)

halcon中的实现方式如下:

polar_trans_image_ext (Image, ImagePolar, Row, Column, 0, rad(360), Radius - 30, Radius - 5, WidthP, HeightP, 'bilinear')
dev_open_window (0, 0, WidthP, HeightP, 'black', WindowHandle2)
rotate_image (ImagePolar, ImageRotate, 180, 'constant')

其中“polar_trans_image_ext”具体请参考halcon的帮助文档,其中“Nearest Neighbor”是最近邻插值,合成的图像可能造成边缘锐利;“Bilinear”是双线性插值法,四邻域的加权平均生成新的像素值,边缘较好,但是耗时较久。
其中“rotate_image”是将平铺的图像旋转180°。

4. 字符区域提取

通过图像极坐标转换后,获得图像展开图像后需要有效的提取区域中的字符区域,具体代码如下:

* 再次利用动态阈值分割找到字符的区域
mean_image (ImageRotate, ImageMeanRotate, 51, 9)
dyn_threshold (ImageRotate, ImageMeanRotate, RegionDynThreshChar, 5, 'dark')
connection (RegionDynThreshChar, ConnectedRegions1)
* 提取“ConnectedRegions1”面积30-150 宽度4-10 的区域
select_shape (ConnectedRegions1, SelectedRegions, ['area', 'width'], 'and', [30, 4], [150, 10])
* 将区域按照“column”进行排序
sort_region (SelectedRegions, SortedRegions, 'character', 'false', 'column')
* 防呆作用 利用全局分割找到字符区域的整体范围,保留其与“SelectedRegions”有交集的
threshold (ImageMeanRotate, Region, 90, 255)
intersection (SelectedRegions, Region, RegionIntersection)
area_center (RegionIntersection, Area, Row1, Column1)
select_mask_obj (RegionIntersection, Characters, Area [>] 0)
dev_display (ImageRotate)

效果如下图所示:
在这里插入图片描述

5. 字符识别

* 加载0-9与A-z的字符模型
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej', OCRHandle)
* 按照character 模式排序
sort_region (Characters, SortedRegions, 'character', 'true', 'row')
* 字符识别 "Class"识别的结果,"Confidence"置信度
do_ocr_multi_class_mlp (SortedRegions, ImageRotate, OCRHandle, Class, Confidence)
* 将字符串中的"o"替换为"0"
tuple_regexp_replace (sum(Class), 'O', '0', Result)

“sort_region”其中’character’讲述起来有点困难,参考了下面这篇文章,按照文章描述该例程 对“row”还是“column”区别不大?该部分等后续再研究一下吧,也欢迎大佬替我补充解释一下。
https://www.cnblogs.com/xh6300/p/16573269.html
该例程主要是如何通过极坐标转换完成环形的字符识别,对于字符识别类的项目参考意义很大。

参考

[1] https://blog.csdn.net/LuohenYJ/article/details/114842373
[2] https://www.cnblogs.com/xh6300/p/16573269.html

标签:字符,字符识别,例程,非线性,SelectedRegions,Halcon,区域,图像
From: https://blog.csdn.net/qq_51171372/article/details/140484113

相关文章

  • 电工电子实验——集成运算放大器的非线性应用
    正弦波形产生电路实验目的加深理解RC桥式正弦振荡器的工作原理。学习并掌握RC桥式正弦振荡器的设计方法和步骤。掌握RC桥式正弦振荡器的调试方法。主要仪器设备及软件硬件:硬件:双踪示波器、函数信号发生器、直流稳压电源、交流毫伏表、实验箱、万用表、阻容元件及导线......
  • 毕业设计 基于机器视觉的PCB焊接缺陷检测系统(Halcon+C#)
    毕业设计基于机器视觉的PCB焊接缺陷检测系统一、功能需求检测PCB板的焊接缺陷:漏焊、虚焊等二、开发环境1、Halcon2、C#三、运行效果处理图片:运行视频:毕业设计基于机器视觉的PCB焊接缺陷检测系统毕业设计资料(C#软件源码+Halcon算法源码+开题报告+毕业设计+......
  • HALCON 2D高精密测量项目全流程解析
    1.标定相关的任务–>>解决畸变和坐标系的转换1.1描述和查找标定对象1.2补偿透视和径向变形,径向畸变包括枕形畸变和桶形畸变1.3相机参数(内外参)1.4图像坐标到世界坐标的转换1.5自标定:不用标定板用图像四周包含直线特征进行标定1.6其他标定:一台相机标定、多台相机......
  • 以非线性弹簧为例,从能量角度构造李雅普诺夫标量函数V(2)
    建立状态空间表达式非线性弹簧阻尼质量块系统 在考虑无输入力的条件下,根据前文,得到非线性弹簧阻尼质量块系统位移的二阶微分方程:(1) 将质量块的位移记为状态变量,质量块的速度记为状态变量......
  • Halcon 学习笔记(4):导航首页
    目录前言数据模板,ListBox触发器行为regoin使用注册regoin命名空间,比如MainViewRegionIoc获取Resion管理器添加跳转命令简单逻辑前言这次主要是UI界面的学习和复习数据模板,ListBoxListBox算是最常用的数据模板了ListBoxListBox.ItemsPanel:布局容器申明ListBox.ItemContai......
  • Halcon学习笔记——Day2
    十四、halcon运行方式1、单步运行F62、F2重置程序执行3、F5连续运行,遇到stop或者断点会停止十五、特征直方图1、横坐标表示特征的值,纵坐标表示连通域的个数十六、灰度直方图1、threshold、scale_image2、行坐标表示灰度值 3、纵坐标表示像素个数十七、通过工具栏......
  • Halcon中区域的Roundness和Circularity特征的区别
      在Halcon中,区域的特征Roundness(圆度)和Circularity(圆度)虽然都用于描述区域与圆形之间的相似程度,但它们在计算方法和应用上存在一些区别。还是从帮助文档着手: 1、Roundness(圆度) 机翻: 计算方法:Roundness通常通过计算区域轮廓上各点到区域中心的平均距离(Distance)与......
  • Halcon学习笔记——Day1
    题外话:最近因为项目需要halcon,所以开始学习一下halcon,顺便记录一下学习的笔记,如果感兴趣就给个关注,后续我会持续更新关于halcon的学习笔记;一、视觉包含的学科:1、数学2、软件3、图像4、光学5、控制6、电气二、视觉需求1、识别定位2、测量(2D、3D)3、缺陷(外观检测)......
  • Halcon学习笔记(3):WPF 框架搭建,MaterialDesign+Prism
    目录前言环境Nuget安装新建WPF类库项目初始化PrismApp启动页初始化重写MainView前言其实我更喜欢CommunityToolkit.mvvm+HandyControl。但是因为找工作,你不能去抗拒新事物。这里就当体验一下完整的流程好了。环境windows11.netcore8.0Nuget安装新建WPF类库项目新......
  • Halcon 学习笔记(2):Halcon+WPF导入
    目录前言.netcore8.0.netcore8.0新功能,打开文件夹和打开文件HSmartWindowControlWPFSystem.Drawing.Common重置拉伸关闭拖拽和缩放文件导出前言这里补充一下Halcon导入到WPF的要求.netcore8.0Halcon是支持.netcore8.0导入的.netcore8.0新功能,打开文件夹和打开文件......