【Halcon基础】OCR识别

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.youkuaiyun.com/weixin_51244852
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处


ocr识别

OCR(Optical Character Recognition,光学字符识别)是一种将印刷或手写文本转换为可编辑文本的技术。它可以通过使用图像处理和模式识别技术来自动识别图像中的文字,并将其转换为可搜索、可编辑的文本。

通常,OCR识别包括以下步骤:

  1. 图像预处理:对输入的图像进行预处理,如灰度化、二值化、去噪等,以提高后续文字分割和识别的准确性。

  2. 文字分割:将图像中的文字与背景分离,通常采用连通区域分析、边缘检测等方法。

  3. 字符识别:对分割后的字符进行识别,通常采用模式识别算法,例如基于特征提取的方法(如投影法、轮廓法、模板匹配等)或基于机器学习的方法(如神经网络、支持向量机等)。

  4. 后处理:将识别出的字符进行校正、修正和排列组合,构建最终的文本结果。

OCR识别广泛应用于各种场景,如文档扫描、车牌识别、银行卡识别、表单处理、自动化数据输入等。它能够提高工作效率,减少人工录入的错误,并方便文本的后续处理和分析。

ocr识别的步骤

1.创建分类器之前要进行训练:其中 .trf格式文件包含着用于训练的样本数据和样本名称,trf格式文件在halcon里面是一个训练文件,将图像(连通域)和字符进行关联。
2.创建分类器
3.训练分类器
4.识别
关键:字符分割、字符定位

分类器的种类

多层神经网络(MLP):mlp神经网络:输入层、中间层、输出层

支持向量机(SVM) : 一种监督学习的方法,广泛用于统计分类及回归分析;

K-最邻近 (K-NN)

高斯混合类型(GMM)

选择适合的分类器

MLP、GMM、SVM和K-NN这几种分类器是很强大且灵活的。对于图像分割,这四种分类器方法加上LUT(查表),能显著提升处理速度。但LUT最多支持3通道的图像。此外,LUT需要更高的内存需求且离线阶段的处理(如训练样本)更慢(lead to slower offline phase)。
MLP分类器: 特别适合于需要快速分类但能接受离线训练样本慢 的应用;
SVM分类器: 经过调整,能够比其他分类器实现更高质量的分类,但相对的检测速度要慢;但不支持缺陷检测。
GMM分类器: 训练和分类查找都很快,特别是当类的数量较少时;非常适合缺陷检测,但只适合那些不需要高维度空间的应用;
K-NN分类器: 训练非常快且无维度空间的限制,所以非常适合有多种结构的特征和训练数据;此外,要加入额外的训练数据也非常快。缺点是比MLP要慢但是占用内存却更多,某些应用可能无法接受这个特点。

将识别目标的特征进行分类、训练,下一次识别的时候符合哪个特征,从而得出识别结果。
特征种类:颜色、形状、概率特征、描述算子特征等等

OCR训练文件浏览器

这个工具用于查看trf文件
文件——加载训练器——选择文件

示例:使用mlp神经网络做ocr识别。

* 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)利用roi工具绘制一个矩形区域,按右键确定即可。
reduce_domain (Image, Rectangle, Image)对绘制的图进行抠图

* Segment the image图像分割
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')对产生的连通域进行排序,排序的方式有很多。'true'表示按照递增的关系, 'row'表示按照行的关系进行排序,
dev_display (Characters)
disp_message (WindowHandle, 'Training characters', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Compute the true class of each character
count_obj (Characters, Number)计算连通域的个数
Length := Number / 27 
Classes := []定义变量。对所有排序的26个字符进行定义赋值。
for J := 0 to 25 by 1
    Classes := [Classes,gen_tuple_const(Length,chr(ord('a') + J))]对a这个字符求阿斯克码,然后加上1,因为第一个是给a赋值,下一个是给b赋值。执行完后会形成一个字符串数组,也就是下面classes的值。将这些字符刚才排序的区域进行一一对应
endfor
Classes := [Classes,gen_tuple_const(Length,'.')]
* Construct the necessary training file from the segmented characters
write_ocr_trainf (Characters, Image, Classes, TrainFile)	只是将区域跟字母名字关联起来了,并没有进行训练。TrainFile这个文件可以修改它的
* 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)写入了一个trf文件,下次用的时候就要读入这个文件。TrainFile, CharacterNames, CharacterCount分别表示读入的文件、字符名称以及个数
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 20, 'canonical_variates', 26, 42, OCRHandle)读进来之后需要创建分类器。这次创建的是神经网络的分类器。
* Train the classifier
trainf_ocr_class_mlp (OCRHandle, TrainFile, 100, 0.01, 0.01, Error, ErrorLog)这一步是训练分类器。创建分类器之后,括号内分别是巨柄,文件名

* 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)这一句就是识别的函数。这一步开始识别了
halcon里面有两种识别方式:一种是集体多个识别,就需要将连通域、对于的图像(原图)、分类器的句柄、最后就是得出的结果和信任度。
还有一种就是单个识别,其中的multi换成single就可以了。
* Display results显示结果
area_center (Characters, Area, Row, Column)
dev_display (Image)
set_display_font (WindowHandle, 16, 'sans', 'true', 'false')
for J := 0 to |Row| - 1 by 1
    disp_message (WindowHandle, Class[J], 'image', Row[J] - 16, Column[J] + 8, 'blue', 'false')
endfor
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
disp_message (WindowHandle, 'Classification result', 'window', 12, 12, 'black', 'true')
clear_ocr_class_mlp (OCRHandle)清除分类器
dev_set_check ('~give_error')
delete_file (TrainFile)删除trf文件
dev_set_check ('give_error')

halcon 学习笔记 一分类器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望闻问嵌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值