halcon识别验证码,先训练后识别

识别验证码图片,使用halcon 21.05
下面代码识别准确率100%

目录

    • 训练,图片打标签
    • 使用代码创建分类器;
    • 识别验证码,检验识别效果
    • 使用“助手”加载训练文件,加载训练分类器,察看收集的字符,训练识别准确率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

训练,图片打标签

* 
* Training of the OCR
* The font is used in "bottle.hdev"
* 
* 
* Step 0: Preparations
 

* 
* Step 1: Segmentation
FontName:='yan_zheng_ma119'

* 训练文件保存
TrainingFileName:='E:/Work/'+FontName+'.trf'

* 分类器保存
FontFileOMC:='E:/Work/'+FontName+'.omc'

dev_update_window ('off')
*训练
* 1  ,18   
* 30
*  已经训练 
* 已经训练了39,40,52
    * 图29、54 重点识别
*   read_image (Image, 'E:/Work/验证码图片/9.jpg')   
read_image (Image, 'E:/Work/验证码图片1/744.jpg')
    
*获取图片尺寸
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, 4 * Width, 7 * Height, 'black', WindowID)
* 设置打印字符的大小
set_display_font (WindowID, 80, 'mono', 'true', 'false')

*放大图片
zoom_image_size(Image,ImageZoom,4 * Width,4 * Height ,'constant')
 

*创建指定区域
gen_rectangle1 (Rectangle, 36, 57, 189, 588)
* 获取图片指定区域的图片
reduce_domain(ImageZoom,Rectangle,imgMask)


* 根据阈值选取图像,筛选体积大的,数字越大体积越大,红色为选中
*threshold (Image, RawSegmentation, 200, 300)
threshold (imgMask, RawSegmentation, 0.1, 160)



*connection (circleRegion, ConnectedRegions)

*内部充满
fill_up (RawSegmentation, RegionFillUp)

*char_threshold (Image, Image, Characters, 3, 50, Threshold)

*根据形状特征填充孔洞
 *fill_up_shape(RawSegmentation, fillRegin, 'area', 5, 5)

*去掉小的模块
*opening_rectangle1 (RegionFillUp, Cut,2,2)

*利用矩形结构元素执行开运算。矩形宽设为1,高为7,相当于低于7的连接被截断
*opening_rectangle1 (RegionFillUp, Cut,3, 3)

*分割粘连字符  10,30,,60,80    不行:90,100;宽度79,74,84,71
  * 20 等号污染了问号;
  * per 55识别成功29、54
  *partition_dynamic(circleRegion,parRegion,70,55)
   
  * 成功拆分,图片9
  *partition_dynamic(circleRegion,parRegion,55,50)
   * 成功拆分,图片11
  * partition_dynamic(circleRegion,parRegion,55,55)
 * 成功拆分,图片29   
  *partition_dynamic(circleRegion,parRegion,55,70)
 *成功划分7.jpg  `
   *partition_dynamic(circleRegion,parRegion,60,70)
  *成功划分998.jpg    
 *  partition_dynamic(circleRegion,parRegion,60,50)

     *將單個字符暈染連成一塊,水平、垂直方向延伸粘连
    closing_rectangle1 (RegionFillUp, RegionClosing1,1, 25)
     
* 开口可以消除小区域(比圆形结构元件小)并平滑区域的边界。
opening_circle (RegionClosing1, circleRegion,5)
     
     *着色
     connection (circleRegion, ConnPatterns)
 
*分割 ,默认以 partition_dynamic分割,能正确分割大多数图片情况;
*partition_dynamic(RegionFillUp,parRegion,60,50)
 partition_rectangle (ConnPatterns, par2, 76, 150)
partition_dynamic(ConnPatterns,par1,60,80)
  
*着色对象个数
  count_obj (par1, par1_count)
  count_obj (par2, par2_count)
  
  AgainCheck:=0
  
  * 检查两个对象分割的块个数是否一致
  if ( par1_count != par2_count )
      partition_rectangle (ConnPatterns, par1, 76, 150)
      
       AgainCheck:=1
  endif
  
  
   * 第二次检查,每个分割块的宽度,是否在允许范围?
   if (AgainCheck==0)
        count_obj (par1, par1_count)
        
              *select_obj调用之前,必须调用sort_region
              sort_region (par1, SortedRegions2, 'first_point', 'true', 'column')
*                select_obj (SortedRegions2, CharRegion, 1)
*                select_obj (SortedRegions2, CharRegion, 2)
*                select_obj (SortedRegions2, CharRegion, 3)
*                select_obj (SortedRegions2, CharRegion, 4)
*                select_obj (SortedRegions2, CharRegion, 5)              
            
              for P := 1 to par1_count   by 1
                select_obj (SortedRegions2, CharRegion, P )
                
                 * 获取region的宽度
                 region_features (CharRegion, 'width', CharWidth)
                 if (CharWidth < 46  or  CharWidth>107 )
                      partition_rectangle (ConnPatterns, par1, 76, 150)
                      break
                 endif
                 
              endfor
   endif

*  与threshold后的图,求交集
intersection (par1, RawSegmentation, NumberCandidates)
 
* 选择指定尺寸的块
select_shape (NumberCandidates, Numbers, ['width','height'], 'and',[40, 10],[100,150])

*着色对象个数
* count_obj (Numbers, Check_count)
* 如果着色对象数不足5个,说明分割有问题
* if ( Check_count!=5)
*       partition_rectangle (ConnPatterns, par2, 76, 150) 
*       intersection (par2, RawSegmentation, NumberCandidates)
*       select_shape (NumberCandidates, Numbers, ['width','height'], 'and',[40, 10],[100,150])
* endif


sort_region (Numbers, SortedRegions, 'first_point', 'true', 'column')
dev_display (imgMask)
dev_set_color ('green')
dev_set_line_width (2)
dev_set_shape ('rectangle1')
dev_set_draw ('margin')
dev_display (SortedRegions)
* 
stop()

*----------------训练模型,开始-----------------------
TrainingNames := ['1','/','1','=' ,'?']
*TrainingFileName := FontName + '.trf'
shape_trans (SortedRegions, RegionTrans, 'rectangle1')
area_center (RegionTrans, Area, Row, Column)
MeanRow := mean(Row)
dev_set_check ('~give_error')
*delete_file (TrainingFileName)
dev_set_check ('give_error')
 
*图片数字下标
K:=0
for I := 0 to |Column| - 1 by 1
    select_obj (SortedRegions, CharaterRegions, I+1)
    * 获取region的宽度
   *  region_features (CharaterRegions, 'width', CharWidth)
     
    gen_empty_region (EmptyObject)     
    if(CharaterRegions!=EmptyObject)          
         append_ocr_trainf (CharaterRegions, imgMask, TrainingNames[K], TrainingFileName)
         disp_message (WindowID, TrainingNames[K], 'window', MeanRow+180, Column[I]-26, 'magenta', 'false') 
        K:=K+1
    endif
      
  
endfor

*----------------训练模型,结束-----------------------


使用代码创建分类器;

在所有的样本图片都打上标签后,就可以训练多层感知分类器了


TrainFile:='E:/Work/yan_zheng_ma119.trf'
FontFileOMC:='E:/Work/yan_zheng_ma119.omc'

*读取训练文件的字符
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)

*使用多层感知器创建OCR分类器。
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 20,'none', 81, 42, OCRHandle)

*训练OCR分类器。
trainf_ocr_class_mlp (OCRHandle, TrainFile, 100, 0.01, 0.01, Error, ErrorLog)

*写入分类器文件保存
write_ocr_class_mlp (OCRHandle, FontFileOMC)

识别验证码,检验识别效果



* 
* Step 1: Segmentation
FontName:='yan_zheng_ma119'

* 分类器保存
FontFileOMC:='E:/Work/'+FontName+'.omc'

dev_update_window ('off')

*训练
 * 重点识别:图29、54、9,11,
 *
 * 循环图片文件列表,一个个识别
 
 *读取目录里面的文件
 list_files ('E:/Work/验证码3', ['files' ], ImageFiles)
 
 for ImgIndex := 1 to |ImageFiles|  by 1
 *for ImgIndex := 1 to 1000  by 1 
  fileName:=ImageFiles[ImgIndex - 1]
  read_image (Image, fileName) 
*   read_image (Image, 'E:/Work/验证码图片/29.jpg')
 
  * 拆分字符串
  tuple_split(fileName,'\\',fileNameShort)
  *取最后一个字符串
  fileShortName:=fileNameShort[5]
  
  *文件数量数
   fileCount := |ImageFiles|
   * 待处理文件数
   fileCount_surplus  := |ImageFiles|-ImgIndex

get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, 4 * Width, 7 * Height, 'black', WindowID)
* 设置显示字体大小
set_display_font (WindowID, 27, 'mono', 'true', 'false')

zoom_image_size(Image,ImageZoom,4 * Width,4 * Height ,'constant')

 *显示图片序号
disp_message (WindowID, fileShortName+',剩余待处理数'+fileCount_surplus+'/'+fileCount, 'window', 0, 0, 'magenta', 'false') 
 

*regiongrowing (ImageInvert, Regions, 2, 2, 1, 255)
*gen_rectangle1 (Rectangle, 4.875, 24.125, 46.625, 141.875)
gen_rectangle1 (Rectangle, 36, 57, 189, 588)
reduce_domain(ImageZoom,Rectangle,imgMask)

* 筛选体积大的,数字越大体积越大,红色为选中
threshold (imgMask, RawSegmentation, 0.1, 160)


*内部充满
fill_up (RawSegmentation, RegionFillUp)

*char_threshold (Image, Image, Characters, 3, 50, Threshold)

*根据形状特征填充孔洞
 *fill_up_shape(RawSegmentation, fillRegin, 'area', 5, 5)

*去掉小的模块
*opening_rectangle1 (RegionFillUp, Cut,2,2)

*利用矩形结构元素执行开运算。矩形宽设为1,高为7,相当于低于7的连接被截断
*opening_rectangle1 (RegionFillUp, Cut,3, 3)

     *將單個字符暈染連成一塊,水平、垂直方向延伸粘连
    closing_rectangle1 (RegionFillUp, RegionClosing1,1, 25)

     
* 开口可以消除小区域(比圆形结构元件小)并平滑区域的边界。
opening_circle (RegionClosing1, circleRegion,5)
     
     *着色
     connection (circleRegion, ConnPatterns)
 
*分割粘连字符 ,默认以 partition_dynamic分割,能正确分割大多数图片情况;
*partition_dynamic(RegionFillUp,parRegion,60,50)
 partition_rectangle (ConnPatterns, par2, 76, 150)
partition_dynamic(ConnPatterns,par1,60,80)
  
*着色对象个数
  count_obj (par1, par1_count)
  count_obj (par2, par2_count)
  
  AgainCheck:=0
  
  * 检查两个对象分割的块个数是否一致
  if ( par1_count != par2_count )
      partition_rectangle (ConnPatterns, par1, 76, 150)
      
       AgainCheck:=1
  endif
  
  
   * 第二次检查,每个分割块的宽度,是否在允许范围?
   if (AgainCheck==0)
        count_obj (par1, par1_count)
        
              *select_obj调用之前,必须调用sort_region
              sort_region (par1, SortedRegions2, 'first_point', 'true', 'column')
*                select_obj (SortedRegions2, CharRegion, 1)
*                select_obj (SortedRegions2, CharRegion, 2)
*                select_obj (SortedRegions2, CharRegion, 3)
*                select_obj (SortedRegions2, CharRegion, 4)
*                select_obj (SortedRegions2, CharRegion, 5)              
            
              for P := 1 to par1_count   by 1
                select_obj (SortedRegions2, CharRegion, P )
                
                 * 获取region的宽度
                 region_features (CharRegion, 'width', CharWidth)
                 if (CharWidth < 46  or  CharWidth>107 )
                      partition_rectangle (ConnPatterns, par1, 76, 150)
                      break
                 endif
                 
              endfor
   endif

*  与threshold后的图,求交集
intersection (par1, RawSegmentation, NumberCandidates)
 
* 选择指定尺寸的块
select_shape (NumberCandidates, Numbers, ['width','height'], 'and',[40, 10],[100,150])

*着色对象个数
* count_obj (Numbers, Check_count)
* 如果着色对象数不足5个,说明分割有问题
* if ( Check_count!=5)
*       partition_rectangle (ConnPatterns, par2, 76, 150) 
*       intersection (par2, RawSegmentation, NumberCandidates)
*       select_shape (NumberCandidates, Numbers, ['width','height'], 'and',[40, 10],[100,150])
* endif

sort_region (Numbers, SortedRegions, 'first_point', 'true', 'column')
dev_display (imgMask)
dev_set_color ('green')
dev_set_line_width (2)
dev_set_shape ('rectangle1')
dev_set_draw ('margin')
dev_display (SortedRegions)
* 
* stop()
 
shape_trans (SortedRegions, RegionTrans, 'rectangle1')
area_center (RegionTrans, Area, Row, Column)
MeanRow := mean(Row)
dev_set_check ('~give_error')

dev_set_check ('give_error')
 
* 设置显示字体大小
set_display_font (WindowID, 80, 'mono', 'true', 'false')

*----------------识别 ,开始 -----------------------
read_ocr_class_mlp (FontFileOMC, OCRHandle2)

*图片数字下标
K:=0
for I := 0 to |Column| - 1 by 1
    select_obj (SortedRegions, CharaterRegions, I+1)
     
    gen_empty_region (EmptyObject)     
    if(CharaterRegions!=EmptyObject)          
         do_ocr_multi_class_mlp (CharaterRegions, imgMask, OCRHandle2, Class, Confidence)
         disp_message (WindowID, Class, 'window', MeanRow+180, Column[I]-26, 'magenta', 'false') 
        K:=K+1
    endif
      
    * 不打印第二个数字右侧的 =,?
   if( I==2 )
       break
   endif
    
endfor

* 等待0.5秒钟
 wait_seconds (0.5)

* 循环图片结束
 endfor

*----------------识别 ,结束-----------------------


使用“助手”加载训练文件,加载训练分类器,察看收集的字符,训练识别准确率

在这里插入图片描述在这里插入图片描述
加载训练文件,加载分类器;
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Theory behind GAN

假如要生成一些人脸图&#xff0c;实际上就是想要找到一个分布&#xff0c;从这个分布内sample出来的图片像是人脸&#xff0c;分布之外生成的就不像人脸。而GAN要做的就是找到这个distribution。 在GAN之前用的是Maximum Likelihood Estimation。 Maximum Likelihood Estimat…

【C++】类和对象(5)--运算符重载

目录 一 概念 二 运算符重载的实现 三 关于时间的所有运算符重载 四 默认赋值运算符 五 const取地址操作符重载 一 概念 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数…

Android 13.0 Launcher3仿ios长按app图标实现抖动动画开始拖拽停止动画

1.概述 在13.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中 的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的 功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现…

基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码

基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于静电放电算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于静电放电优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【数据结构与算法】JavaScript实现双向链表

文章目录 一、双向链表简介二、封装双向链表类2.0.创建双向链表类2.1.append(element)2.2.toString()汇总2.3.insert(position,element)2.4.get(position)2.5.indexOf(element)2.7.update(position,element)2.8.removeAt(position)2.9.其他方法2.10.完整实现 三、链表结构总结3…

苍穹外卖--员工分页查询

请求参数封装&#xff1a; Data public class EmployeePageQueryDTO implements Serializable {//员工姓名private String name;//页码private int page;//每页显示记录数private int pageSize;}请求结果封装&#xff1a; public class PageResult implements Serializable {…

青岛数字孪生赋能工业制造,加速推进制造业数字化转型

随着企业数字化进程的推进&#xff0c;数字孪生技术逐渐在汽车行业得到广泛应用。5G与数字孪生、工业互联网的融合将加速数字中国、智慧社会建设&#xff0c;加速中国新型工业化进程&#xff0c;为中国经济发展注入新动能。数字孪生、工业物联网、工业互联网等新一代信息通信技…

Pattern Recognition投稿经验

文章目录 ManuscriptTitle PageHighlightsAuthor BiographyDeclarationSubmit 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ 停更了大半年&#xff0c;近期终于完成了论文投稿&#xff0c;趁…

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

什么是PWA(Progressive Web App)?它有哪些特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【算法训练营】参数解析+跳石板

&#x1f308;欢迎来到Python专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mys…

跟我一起来做一个音视频产品功能!

前言&#xff1a; 大家好&#xff0c;上来和大家汇报一下h264翻译进度&#xff0c;目前翻译完了第六章&#xff0c;第七章快翻译完了&#xff0c;马上可以翻译第八章。 在第七章翻译完了之后&#xff0c;我会做一个知识点总结出来&#xff0c;一起学习&#xff0c;一起进步&…

小程序授权获取昵称

wxml: <form bindsubmit"formsubmit"><view style"width: 90%;display: flex;margin-left: 5%;"><view class"text1">昵称&#xff1a;</view><input style"width: 150px;margin-left: 30px;margin-top: 30px;…

操作系统秋招面试题

自己在秋招过程中遇到的高频操作系统相关的面试题 内存管理 虚拟内存 虚拟内存的⽬的是为了让物理内存扩充成更⼤的逻辑内存&#xff0c;从⽽让程序获得更多的可⽤内存。 为了更好的管理内存&#xff0c;操作系统将内存抽象成地址空间。每个程序拥有⾃⼰的地址空间&#xff…

【具身智能评估1】具身视觉语言规划(EVLP)仿真环境汇总

参考论文&#xff1a;Core Challenges in Embodied Vision-Language Planning 论文作者&#xff1a;Jonathan Francis, Nariaki Kitamura, Felix Labelle, Xiaopeng Lu, Ingrid Navarro, Jean Oh 论文原文&#xff1a;https://arxiv.org/abs/2106.13948 论文出处&#xff1a;Jo…

恕我直言,大模型对齐可能无法解决安全问题,我们都被表象误导了

是否听说过“伪对齐”这一概念&#xff1f; 在大型语言模型&#xff08;LLM&#xff09;的评估中&#xff0c;研究者发现了一个引人注目的现象&#xff1a;当面对多项选择题和开放式问题时&#xff0c;模型的表现存在显著差异。这一差异根源在于模型对复杂概念的理解不够全面&…

SpringCloud 之Feign的性能优化

Feign底层默认是JDK自带的HttpURLConnection&#xff0c;它是单线程发送HTTP请求的&#xff0c;不能配置线程池&#xff0c;我们使用Okhttp或者HttpClien 朵发送http请求&#xff0c;并且它们两个都支持线程池。 常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Comm…

数位和相等数对的最大和【教3妹学编程-算法题】数位和相等数对的最大和

3妹&#xff1a;2哥&#xff0c;你有没有看到新闻“18岁父亲为4岁儿子落户现身亲子鉴定” 2哥 : 啥&#xff1f;18岁就当爹啦&#xff1f; 3妹&#xff1a;确切的说是14岁好吧。 2哥 : 哎&#xff0c;想我30了&#xff0c; 还是个单身狗。 3妹&#xff1a;别急啊&#xff0c; 2…

mfc140u.dll丢失的解决方法,以及针对每个解决mfc140u.dll丢失办法的优缺点

在使用电脑的过程中&#xff0c;有时会遇到一些与动态链接库文件&#xff08;DLL&#xff09;相关的错误。其中&#xff0c;mfc140u.dll丢失是一种常见的问题&#xff0c;它可能导致应用程序无法正常运行。在本文中&#xff0c;我们将探讨关于mfc140u.dll丢失的解决办法&#x…