HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测

HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测

示例程序源码(加注释)

1、先介绍bottlet.hdev(训练OCR识别文件)

*定义一个字符串变量FontName ,内容是bottle
FontName := ‘bottle’
*第一步分割字符,以便单独对字体进行训练
Step 1: Segmentation
*窗口显示更新关闭
dev_update_window (‘off’)
*读入图片
read_image (Bottle, ‘bottle2’)
*得到读入图片大小
get_image_size (Bottle, Width, Height)
*关闭显示窗口
dev_close_window ()
*根据刚刚获得的图片大小创建图片大小二倍的窗口
dev_open_window (0, 0, 2 * Width, 2 * Height, ‘black’, WindowID)
*设置字体显示格式
set_display_font (WindowID, 27, ‘mono’, ‘true’, ‘false’)
*对读入图片进行阈值分割
threshold (Bottle, RawSegmentation, 0, 95)
*对区域面积在1-5之间的进行孔洞填充,目的就是为了消除噪声。
fill_up_shape (RawSegmentation, RemovedNoise, ‘area’, 1, 5)
*使用半径位2.5的圆形元素进行开运算
opening_circle (RemovedNoise, ThickStructures, 2.5)
*进行孔洞填充
fill_up (ThickStructures, Solid)
*使用宽7高1的矩形元素对区域进行开运算
opening_rectangle1 (Solid, Cut, 1, 7)
*分割连通域
connection (Cut, ConnectedPatterns)
*取区域ConnectedPatterns与区域ThickStructures的交集,将字符的原本形态恢复,之前对字符也进行了填
*充是怕进行开运算的时候把字符也给干掉
intersection (ConnectedPatterns, ThickStructures, NumberCandidates)
*使用面积对区域进行筛选,筛选出面积在300-9999的区域
select_shape (NumberCandidates, Numbers, ‘area’, ‘and’, 300, 9999)
*对区域进行排序,按照列,从第一列到最后一列,按照升序进行排列。这个算子之前介绍过了哈
sort_region (Numbers, FinalNumbers, ‘first_point’, ‘true’, ‘column’)
*显示,下面的算子之前的都进行了介绍,这里就不进行细说了。
dev_display (Bottle)
dev_set_color (‘green’)
dev_set_line_width (2)
dev_set_shape (‘rectangle1’)
dev_set_draw (‘margin’)
dev_display (FinalNumbers)
*第二步进行训练前相关准备,排序与定义分割出的区域代表字符。
Step2: Training file generation
*根据上文分割出的字符区域从左到右的顺序,将他们的命名存入TrainingNames 数组变量中,其实就是你的
*字符是啥你就在这个训练数组里写入什么,让halcon知道你刚刚分割出的字符的含义。
TrainingNames := [‘0’,‘1’,‘0’,‘8’,‘9’,‘4’]
*定义训练出来的文件的路径与文件名。这里强调一下哈,这里没有路径是因为它会把训练文件存入halcon的
*默认路径中,我们想把训练文件存在我们想要的地方就得这么写:TrainingFileName := C:/ + ‘.trf’。
TrainingFileName := FontName + ‘.trf’
*对区域进行排序,按照列,从第一列到最后一列,按照升序进行排列。和上边一样
sort_region (FinalNumbers, SortedRegions, ‘first_point’, ‘true’, ‘column’)
*分别求取每一个字符的最小外接矩形
shape_trans (SortedRegions, RegionTrans, ‘rectangle1’)
*求取每个区域的面积与中心坐标
area_center (RegionTrans, Area, Row, Column)
*mean这个算子:返回数组中元素的平均值。这里MeanRow 就是字符平均行位置
MeanRow := mean(Row)
*halcon的异常处理,程序运行正常的话程序会继续运行,如果出错显示错误内容弹窗。在这里为了检查求取
*数组均值是否完成,咱们设想一下,如果咱们提取字符没提取出来,area_center 求取的Row为空,那么进
*行均值计算的时候除以0,程序就会崩溃。
dev_set_check (’~give_error’)
*删除文件TrainingFileName
delete_file (TrainingFileName)
*这里再进行异常检查,如果这个文件正在打开或者被使用,是删除不了的,所以还要进行异常检查
dev_set_check (‘give_error’)
*下边一段代码是把刚刚咱么在TrainingNames 的数字按照分割出字符的位置进行一个显示,为了什么呢,就
*是为了让我们直观的看到我们存入TrainingNames 的字符与咱们分割出的是不是一一对应,如果不对应则会
*导致训练出的文件是错的。
for i := 0 to |TrainingNames| - 1 by 1
select_obj (SortedRegions, CharaterRegions, i + 1)
append_ocr_trainf (CharaterRegions, Bottle, TrainingNames[i], TrainingFileName)
disp_message (WindowID, TrainingNames[i], ‘image’, MeanRow - 40, Column[i] - 6, ‘yellow’, ‘false’)
endfor
*第三部训练
Step3: Training
*sort按照升序对数组元素进行排列;tuple_uniq - 丢弃元组中连续相同元素。那么我们最开始的数组:
*[‘0’,‘1’,‘0’,‘8’,‘9’,‘4’]先进行升序排列得到[‘0’,‘0’,‘1’,‘4’,‘8’,‘9’]之后剔除相同元素得到[‘0’,‘1’,‘4’,‘8’,‘9’]
*最终CharNames =[‘0’,‘1’,‘4’,‘8’,‘9’]
CharNames := uniq(sort(TrainingNames))
*create_ocr_class_mlp - 使用多层感知器创建OCR分类器。
*函数原型:create_ocr_class_mlp(:: WidthCharacter,HeightCharacter,Interpolation,Features,Characters,NumHidden,Preprocessing,NumComponents,RandSeed:OCRHandle)
*WidthCharacter:字符宽度;HeightCharacter:字符高度;Interpolation:插值;Features:方式;
*Characters:字符;NumHidden:字符数量;Preprocessing:预处理;NumComponents:组件数量;
*RandSeed:随机数数量;OCRHandle:OCR训练句柄。
create_ocr_class_mlp (8, 10, ‘constant’, ‘default’, CharNames, 5, ‘none’, 10, 42, OCRHandle)
*trainf_ocr_class_mlp - 训练OCR分类器。
*函数原型:trainf_ocr_class_mlp(:: OCRHandle,TrainingFile,MaxIterations,WeightTolerance,ErrorTolerance:Error,ErrorLog)
*OCRHandle:OCR识别句柄;TrainingFile:训练文件名与路径;MaxIterations:最大迭代次数;
*WeightTolerance:错误公差;Error:错误;ErrorLog:错误日志。
trainf_ocr_class_mlp (OCRHandle, TrainingFileName, 200, 1, 0.01, Error, ErrorLog)
*将训练好的ocr文件写入指定位置。其实就是把训练文件保存下来。
write_ocr_class_mlp (OCRHandle, FontName)
*清除OCR训练句柄。
clear_ocr_class_mlp (OCRHandle)

2、介绍bottlet.hdev(OCR识别)

*定义一个字符串变量FontName ,内容是Industrial_0-9_NoRej
FontName := ‘Industrial_0-9_NoRej’
*第一步:分割字符
Step 1: Segmentation
*显示读入图片操作之前介绍过了,这里就不介绍了
dev_update_window (‘off’)
read_image (Bottle, ‘bottle2’)
get_image_size (Bottle, Width, Height)
dev_close_window ()
dev_open_window (0, 0, 2 * Width, 2 * Height, ‘black’, WindowID)
set_display_font (WindowID, 16, ‘mono’, ‘true’, ‘false’)
dev_display (Bottle)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()

  • 创建读入ocr训练文件
    create_text_model_reader (‘auto’, FontName, TextModel)
  • 设置文本模型的参数最小字符宽度为5
    set_text_model_param (TextModel, ‘min_stroke_width’, 5)
  • 文本行的结构
    set_text_model_param (TextModel, ‘text_line_structure’, ‘2 2 2’)
  • 在图像中查找文本
    find_text (Bottle, TextModel, TextResultID)
  • 显示字符分割结果
    get_text_object (Characters, TextResultID, ‘all_lines’)
    dev_display (Bottle)
    dev_display (Characters)
    stop ()
  • 显示识别的字符结果
    get_text_result (TextResultID, ‘class’, Classes)
    area_center (Characters, Area, Row, Column)
    for Index := 0 to |Classes| - 1 by 1
    disp_message (WindowID, Classes[Index], ‘image’, 80, Column[Index] - 3, ‘green’, ‘false’)
    endfor
  • 释放内存
  • 清理结果句柄
    clear_text_result (TextResultID)
    *清除OCR识别句柄
    clear_text_model (TextModel)

处理思路

这个就是一个简单的OCR字符从分割到训练文本到识别的一个步骤。希望能帮助到大家。

后记

大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】神经网络BP理论与python实例系列

理论部分 《机器学习——人工神经网络之发展历史(神经元数学模型、感知器算法)》 《机器学习——人工神经网络之多层神经网络(多层与三层)》 《机器学习——人工神经网络之后向传播算法(BP算法)》 《机…

bzoj1597: [Usaco2008 Mar]土地购买

斜率优化dp。 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn 50000 10;struct Field {long long x,y; } t[maxn]; long long f[maxn],x[maxn],y[maxn]; int q[maxn],l,r; int n,cnt;bool cmp(F…

vue封装axios接口

一、安装axios axios安装命令&#xff1a;cnpm install axios 二、在文件中引用axios 一开始我是放在src下的main.js这个文件里面&#xff0c;后来发现mounted钩子读取接口方法为undefined&#xff0c;百度了才发现是vue生命周期的原因&#xff0c;最好的解决办法是把axios单独…

编写Arduino支持的C++类库

以下为摘抄的例子&#xff0c;已经亲自验证过&#xff0c;例子是正确的 我们在上一讲中实现了一个TN901红外温度传感器51程序到Arduino程序的转换&#xff0c;如果代码越来越多这样程序的可维护性会随之降低&#xff0c;也不适合团度开发。我们应该把常用的文件封装成C库&#…

函数,游标与存储过程的综合应用

--在TOY数据库中完成以下操作use toygo--1、编写一个存储过程&#xff0c;接收任意一个订单号&#xff0c;打印订单的表头数据。格式如下&#xff1a;--(其中订单编号由订单日期订单号的字符串组成)--订单编号:20010520000001 订货日期:2001-05-20 订货人:拉尔森create pro…

HALCON示例程序check_blister.hdev药品胶囊检测

HALCON check_blister.hdev药品胶囊检测 示例程序源码&#xff08;加注释&#xff09; 显示、读入图片、设置显示字体等&#xff0c;之前的帖子已经介绍过了 dev_close_window () dev_update_off () read_image (ImageOrig, ‘blister/blister_reference’) dev_open_window_f…

【机器学习实战】——常见函数积累

目录 第二章 k近邻算法 1、array.sum(axies 1) : 2、array.argsort(axies0/1) 3、array.tile(mat,(m,n)) 4、dict.get(key,value) 5、sorted函数 6、string.strip()函数 7、string.split() 8、scatter&#xff08;&#xff09;函数 9、min()&max() 10、enumera…

安装oracle 11g 客户端,检查过程中报物理内存不足的解决

今早接到同事电话&#xff0c;说安装oracle 11g客户端的时候&#xff0c;在检查先决条件的时候&#xff0c;报错&#xff0c;说内存不足&#xff0c;但是本机的内存是2G&#xff0c;肯定够用&#xff1a;如图&#xff1a; 找了一圈&#xff0c;原来Oracle执行先决条件检查是依赖…

智能时代 软件赋能——2017中国软件技术大会

由中国科学院软件研究所、中科软科技股份有限公司联合主办&#xff0c;北京中科凯亚科技有限公司协办的第15届中国软件技术大会将于2017年12月在北京 国家会议中心隆重举行。 毋庸置疑&#xff0c;我们正在迈入智能时代&#xff0c;伴随着物联网、云计算、大数据、人工智能等智…

Arduino 代码机制

新建一个Arduino程序。可是建完就郁闷了&#xff0c;因为只看到了setup和loop函数&#xff0c;却没有基本的c函数。 void setup() {// put your setup code here, to run once: }void loop() {// put your main code here, to run repeatedly: }于是好奇心就来了&#xff0c;当…

Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

题目链接&#xff1a;D. Cloud of Hashtags 题意&#xff1a; 给你n个字符串&#xff0c;让你删后缀&#xff0c;使得这些字符串按字典序排列&#xff0c;要求是删除的后缀最少 题解&#xff1a; 由于n比较大&#xff0c;我们可以将全部的字符串存在一个数组里面&#xff0c;然…

HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测

HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测 示例程序源码&#xff08;加注释&#xff09; 读入图片与显示相关设置 dev_close_window () read_image (Image, ‘blister/blister_mixed_reference’) dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHan…

php类与对象

1.类与对象 对象&#xff1a;实际存在该类事物中每个实物的个体。$a new User(); 实例化后的$a 引用&#xff1a;php的别名&#xff0c;两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类&#xff08;逻辑单元&#xff09;里 继承&#xff1a;以原有的类…

【深度学习系列】基础知识、模型学习

基础知识 原创 【深度学习】——训练过程 原创 【深度学习】——BN层&#xff08;batch normalization&#xff09; 原创 【深度学习】——激活函数&#xff08;sigmoid、tanh、relu、softmax&#xff09; 原创 【深度学习】——损失函数 原创 【深度学习】——梯度下…

史陶比尔机器人的 LLI (Low Level Interface)

史陶比尔机器人的 LLI &#xff08;Low Level Interface&#xff09; 史陶比尔机器人拥有 Low Level Interface (LLI)接口选项. 在CS8C控制器的时代&#xff0c;LLI 接口仍然可用。这是一个选项接口。.这是除了VAL3编程语言之外的替代操作系统。通过C程序替代你的程序。 这里的…

阳狮集团与阿里巴巴全域营销伙伴关系再升级:数据和业务合作将更紧密

3月6日&#xff0c;阿里巴巴集团与全球领先的广告传播集团阳狮集团在上海开启了主题为“新局面新高度”新阶段的合作沟通&#xff0c;未来双方将进行更紧密的数据和业务层面的合作。阿里巴巴集团CMO、阿里妈妈总裁董本洪及阳狮媒体大中华区首席执行官张敬鸾就开放共赢达成共识&…

HALCON示例程序check_bottle_crate.hdev啤酒箱内酒瓶数检测

HALCON示例程序check_bottle_crate.hdev啤酒箱内酒瓶数检测 示例程序源码&#xff08;加注释&#xff09; 获取系统关于“空白区域储存的设置” get_system (‘store_empty_region’, StoreEmptyRegion)系统“空白区域储存”设置为 ‘false’ set_system (‘store_empty_regi…

#undef 标识符

#undef 是在后面取消以前定义的宏定义 该指令的形式为 #undef 标识符 其中&#xff0c;标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称&#xff0c;那么就会忽略该指令。一旦定义预处理器标识符&#xff0c;它将保持已定义状态且在作用域内&#xff0c;直到程序结束…

[转]OpenGL库介绍

原帖地址&#xff1a;http://blog.csdn.net/yyyuhan/archive/2008/01/15/2045009.aspx 开发基于OpenGL的应用程序&#xff0c;必须先了解OpenGL的库函数。它采用C语言风格&#xff0c;提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数…

SQL Server优化50法

查询速度慢的原因很多&#xff0c;常见如下几种&#xff1a; 1、没有索引或者没有用到索引(这是查询慢最常见的问题&#xff0c;是程序设计的缺陷) 2、I/O吞吐量小&#xff0c;形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 …