c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...

2.3.2 第二个halcon程序转EXE程序:字符识别

老规矩,每一段halcon代码得用C#二次开发下。根据上一节所教的,我们配置下C#的环境,顺便添加好控件,如下图(2-3-2-1)。

3db5830a8b7d1c1218313f861ad1fccc.png

图 2-3-2-1

控件基本跟上一节一样,只是少了一个button多了一个textBox。我就不用截图教了。

fb171fec74b6fdf045dc316a85843cc7.png

图 2-3-2-2

还是粗鲁的直接上代码。图中(2-3-2-2)①后面为声明全局变量,用来存储读取的图片;Form1_load里面的步骤②,可能新手有点迷糊,这其实是一种编程习惯了。(详见本节TIPS 1)步骤③有两个知识点:第一个是c#的,就是用OpenFileDialog类,该类的作用是显示一个标准的对话框,用于打开文件。当然对于我们这个例子,你也只能打开我给的那张照片,毕竟其它照片就不一定适用于剩下的代码了。适用方法就是如图中红笔标明的第③步了,首先是实例化一个ofd,然后if()条件语句判断,接下来你就可以在readImage()里面用ofd.FileName来表示图片的地址了。有没有比上一节用个string类型的path写地址高大上一丢丢?

de6b4993bdd00072eed39967b0aeb23a.gif

关键是这个方法可以打开任何一张图片,算是比较灵活的打开文件的方式了。当然百度上还有更详细的教程,如果你有兴趣,不妨查查看。

第二个知识点就是,你读取的图片大小跟你的halconWindow大小不匹配怎么办,你得让图片矢量缩放。这个上一节的时候我刻意没讲解,怕知识点太多。现在教刚好,就是图中我画圈的两步。先获取图片的大小:GetImageSize(),里面的参数根据提示通俗易懂,再SetPart(): set the part of the image that is displayed in the graphics window。对,就是这个意思,所以你只要把上一步获得的长宽作为全部尺寸SetPart就可以了。当然有个需要注意的细节:GetImageSize的时候参数顺序是先宽再高,SetPart的时候参数顺序是先高再宽,比如本例中。可是为什么呢?因为坐标,自己悟去吧~~^_^

接下来是大头,OCR的识别,双击"OCR识别"按钮,在里面敲下如下代码,你若牛13,最好先根据上一节教的方法,自己先试试,这样带着问题看答案会效果超级好,我的答案如下图(2-3-2-3):

c8b9b3e5fedb95b87da0d6ce69ea9f2d.png

图2-3-2-3

按照TIPS 1)里面的方法,我们先为所有的图形变量申请一个空变量。就是图中(2-3-2-3)矩形里面的一大坨。然后每个变量用之前先dispose,就是图中椭圆里面的。

8e2142b38a0d5706f58b60b2fd72998d.png

图2-3-2-4

01396b8a716a3050835418fbe277a5d2.png

图 2-3-2-5

程序结束,所有的图形变量再dispose掉,如图中的矩形框内。熟悉了这个大的结构形式,下面我们来看具体的代码。Halcon代码2.3.1里面已经有了,怎么转换,我也第二节里面说过,如果还要我废话,那这本书得厚很多倍。

不过有个地方,还是需要提一下的:就是本代码,我在halcon里面的时候是识别出字符然后在字符上方一定位置显示出来,这里面我没有那么做了,而是用textbox控件显示出来。那就涉及到一个问题,怎么把HTuple类型的classs(因为class是C#的关键字,不能作为变量名使用,所以我加了一个s,你没有意见吧?)里面的字符弄出来。对的,答案已经在上图(2-3-2-5)中了,就是一个for循环。不过所有对HTuple 的操作方法都是'.Tuple+~',比如说它的长度是'.TupleLength()',不是c#自带数组里面的'.Length()',然后就是HTuple每一个成员的调用方法'.TupleSelect()'。当然还有很多其它方法,你可以'.'之后自己看,也都有自带解释。(又是一个打渔方法,有木有?)

有了上一节的halcon程序转exe的铺垫,这一节好讲解多了,虽然代码长了不少,但是总共也就几页纸就可以说清楚了,其实主干部分还是蛮有规律可寻的。

亲爱的读者,当你学习到这一节。其实整个视觉项目的软件部分的主要流程你都大致了解了。只要是基于halcon和C#二次开发的,基本上是脱离不了这个主框架。什么主框架呢?有点懵?好吧。。

第一步:获取图片,一般都是通过相机现场拍照,保存下来;

第二步:用halcon对照片进行图像处理,达到目的(比如例子中的找到人脸,或者识别字符等);

第三步:把halcon代码转成C#代码(大多数情况下是作为一个类或者一个方法),可以自己一步一步转,也可以直接用halcon自己生成的方式(这个我在2.2.2有讲,网上有更详细的教程)。

写完这一节,现在已经是2018年2月份的某个晚上。听着毛不易的《像我这样的人》,不自禁情绪涌上心头。。。今年我就28周岁了,依旧碌碌无为。想做一些事,总是觉得缺把火。喜欢的女同事也一直刻意跟我保持距离。这女孩特别爱笑,眼睛也好看。同事教我三招:1)坚持;2)不要脸;3)坚持不要脸。

话是这么说,但是真的好难做到,总感觉她对我爱答不理,我也不想死皮赖脸,更觉得死皮赖脸会适得其反,毕竟大家都是同事。

亲戚中也有人劝我,不要眼光太高,找个差不多的就可以了。这意思再明白不过:我的能力配不上我的眼光。可是为什么非要我降低眼光呢?我不能提升能力吗?最近在看一本书知乎大神李栩然的《所有的奋斗都是一种不甘平凡》。哈哈,听名字就是鸡汤文。但是生活嘛,你有多久没喝过鸡汤了?隔段时间拿个鸡汤文鞭笞下自己对我来说还是挺有意义的。毕竟"最怕你一生碌碌无为,还安慰自己平凡可贵"……

本节TIPS:

1) 本人写过很多halcon代码,然后自动生成C#代码(方法上一节有说,别跟我说你忘记了)。再慢慢学习这些C#代码后,发现了一个规律:所有的图形变量(HObject,HImage,HRegion等)都是先声明,再为其申请一个空变量,每次用之前先dispose(),程序结束再dispose()。这样的好处是肯定不会有内存泄漏,这个问题上一节我刻意没提,换言之上一节代码有内存泄漏的缺陷,这样的缺陷,单次运行是没有什么关系的,但是一旦运用到工程上,往往都是循环执行的,每次内存泄漏一点儿,积少成多,一会儿系统就崩溃了。因此这一节开始,我们按照规范的来。(其实,当我再检查的时候,发现本例我的代码里面其实也还有变量没有被dispose。哈哈,机智的你发现没有?)

那么,有的人会疑问,为什么要先申请空变量呢?其实是因为,halcon代码自动转成C#代码的时候,一般方法里面都会加上try-catch语句,一旦运行报错,在catch里面也可以把所有的变量dispose()掉,避免内存泄漏,如果没有之前申请的空变量,报错后,就不知道怎么dispose()了。所以都在try-catch语句之前先为声明的所有图形变量(HObject,HImage,HRegion等)申请一个空变量。这个大家多写几次就能理解了。

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

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

相关文章

C语言数据的存储和取出(超详细讲解)

点击蓝字关注我们整形的储存我们知道一个整形的存储是以补码的形式储存取出是原码的形式。比如:int a 5;的二进制是101那它的原码应该是:00000000 00000000 00000000 00000101正数的原反补相同那它存进去和取出来都是:00000000 00000000 000…

go语言 不支持动态加载_动态语言支持

go语言 不支持动态加载本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的旅程! 在这里查看 &am…

【lua学习】2.数据类型

【lua学习】2.数据类型Lua中的数据类型关于TValue自顶向下分析TValue表示所有的Lua数据结构并带一个类型字段Value表示所有的Lua数据结构GCObject表示所有需要进行垃圾回收的数据结构GCheader表示需要GC的数据结构最开始的部分Lua中的数据类型 宏名 (见lua.h)宏值类型对应数据…

打印pdf就一页_PDF 文件转换工具

是将 PDF 文件转换为完全可编辑的 Windows 文档最好的转换软件。无论您需要您的内容是 Microsoft Word、Excel、PowerPoint、HTML 还是仅需要文本, 总会给您一个简单的方法,快捷地获取您要的内容。可转换整个文档或选择内容。亦可创建 PDF 文件。PDF 转换…

C++类的this指针,静态成员,友元函数友元类

点击蓝字关注我们1. this指针在上篇讲C中类,对象,封装,继承(派生),多态的时候,this指针出现在成员函数中,并使用->成员提取符操作成员变量。在 C 中,每一个对象都能通…

jooq和jdbc_将jOOQ与JDBC比较

jooq和jdbc本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时,这是一种替代方法。 它显示了一种现代的领域特定语言如何可…

【lua学习】3.字符串

【lua学习】3.字符串Lua字符串的概况字符串实现字符串结构TString全局字符串表stringtable新建字符串luaS_newlstr (先查表,再决定创建与否)新建字符串 newlstr重新设置全局字符串的大小 luaS_resize全局字符串表的缩容保留字是如何不被回收的…

【lua学习】4.表

1 概述2 数据结构2.1.表Table2.2 键TKey2.3 节点(键值对)Node3 操作算法3.1 查找3.1.1 通用查找luaH_get3.1.2 根据字符串查找 luaH_getstr3.1.3 根据整数查找 luaH_getnum3.2 新增元素/修改元素/删除元素 luaH_set系列3.2.1 根据key获取或创建一个value…

批量提取文件创建时间_批量采集新浪微博用户内容

有时我们需要把某些用户的微博数据全部采集下来用作分析,每条信息复制的工作量是非常低效的,必须要借助工具。今天给大家介绍一款采集软件:微风采集器。打开软件,选择模板,下拉框选:批量提取指定用户微博内…

C++异常的规则

点击蓝字关注我们异常是指存在于程序运行时的异常行为,这些行为超出了函数正常功能的范围,当程序的某部分检测到一个无法处理的问题时,就需要用到异常处理。1. C语言中传统的处理错误方式终止程序:如assert,当发生错误…

java中集合选取怎么选_集合中的可选

java中集合选取怎么选有时有人认为Optional类型值得在集合中使用。 据称&#xff0c;它解决了以下问题&#xff1a; HashMap在没有键映射以及值null映射到键的情况下返回null 。 如果使用Map<Optional<Something>>则可以清楚地区分缺少的映射和缺少的值。 这样一来…

【lua学习】7.环境

1 最重要的两个数据结构1.1 lua_State(Lua虚拟机/Lua协程)1.2 global_State(Lua全局状态)2 环境相关的变量2.1 Global表2.1.1 Global表在lua_State结构中2.1.2 Global表在 f_luaopen 时被初始化2.2 env表2.2.1 env表在Closure结构中2.2.2 查找一个全局变量<>在当前函数的…

异质性查询需要为连线设定_振奋人心!华东理工大学开发新型的荧光染料,为细胞成像奠定基础...

结合并激活荧光染料的适体荧光RNA(FR)已用于对丰富的细胞RNA种类进行成像。然而&#xff0c;诸如低亮度和具有不同光谱特性的染料/适体组合的有限可用性的局限性&#xff0c;限制了这些工具在活的哺乳动物细胞和体内的使用。最近&#xff0c;华东理工大学朱麟勇及杨弋共同通讯在…

C++ STL详解(1)

点击蓝字关注我们概述STL 是“Standard Template Library”的缩写&#xff0c;中文译为“标准模板库”。STL 是 C 标准库的一部分&#xff0c;不用单独安装。C 对模板&#xff08;Template&#xff09;支持得很好&#xff0c;STL 就是借助模板把常用的数据结构及其算法都实现了…

jooq 配置oracle_jOOQ配置

jooq 配置oracle本文是我们学院课程“ jOOQ –类型安全数据库查询”的一部分 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多而JDBC过于抽象时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特定语言…

各种说明方法的答题格式_高中化学:选择题答题方法与知识点总结,让你轻松秒杀各种难题...

选择题是化学考试中被广泛采用的一种题型。它具有知识容量大&#xff0c;覆盖面广&#xff0c;构思新颖、灵活巧妙&#xff0c;考试的客观性强&#xff0c;答题简单&#xff0c;评分容易、客观准确等优点。 选择题按考查形式可分为三种类型&#xff0c;即&#xff1a;常规型选择…

C++ STL详解(2)

点击蓝字关注我们来源自网络&#xff0c;侵删刷题时常用的STLstring之前写过一篇 string 的简介但是不是特别全面&#xff0c;这里再补充说明一下。size()返回字符串中字符的数量#include<iostream> #include<string>using namespace std;int main() {string str …

【lua学习】5.栈和lua_State

1 背景2 栈&#xff08;寄存器数组&#xff09;&#xff0c;虚拟机&#xff0c;全局状态机2.1 栈定义在lua_State结构体中2.2 global_State 全局状态机2.3 lua_newstate 主虚拟机和全局状态机的创建2.4 lua_close 关闭虚拟机3 栈上的地址3.1 假索引3.2 根据数字索引获取栈上的地…

python中反向切片用法_使用Python中的切片[:0:-1]反转列表

举个例子a [1, 2, 3, 4, 4, 5, 6, 9]如果你试着用正指数分割它newa a[1:5]这将导致newa [2, 3, 4, 4]这是因为&#xff0c;在上面这种情况下&#xff0c;切片是这样发生的&#xff0c;[包含&#xff1a;排他的]&#xff0c;包括第一个索引&#xff0c;切片从这个索引开始&am…

斐波那契数列的四种实现方式(C语言)

点击蓝字关注我们来源自网络&#xff0c;侵删斐波那契数列是一组第一位和第二位为1&#xff0c;从第三位开始&#xff0c;后一位是前两位和的一组递增数列&#xff0c;像这样的&#xff1a;0、1、1、2、3、5、8、13、21、34、55......今天&#xff0c;我们用四种方式来进行实现…