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…

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

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

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

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

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

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

C++异常的规则

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

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

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

C++ STL详解(1)

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

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

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

C++ STL详解(2)

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

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

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

linux make命令_第一章 1.3Linux下安装Redis

1.3.2 Linux下安装Redis第一步: 去官网下载安装包 ,传送门第二步: 上传到Linux服务器,解压redis的安装包tar -zxvf redis-6.0.8.tar.gz这里我已经解压好了,并且移动到了redis目录下第三步: 安装基本环境yum -y insatll gcc-c这里注意一个问题,Centos下安装的gcc默认版本为4.8.5…

C语言strcpy函数的使用

点击蓝字关注我们strcpy简单使用&#xff1a; #include <stdio.h> #include <string.h>struct Student {int sid;char name[20];int age;} st; //此处分号不可省略int main(void) {struct Student st {1000,"zhangsan",20};printf("%d %s %d\n&…

什么镜头最适合拍风景_为什么您的风景摄影套件中应始终装有远摄镜头

当您考虑风景摄影镜头时&#xff0c;许多摄影师只考虑广角镜头。14-24mm f / 2.8或24-70mm f / 2.8等经典镜头是用于风景的流行光学元件。它们是绝佳的选择但是&#xff0c;也值得在风景摄影套件中使用长焦镜头。为什么要使用长镜头进行风景摄影&#xff1f;您在网上或浏览Inst…

C++ STL详解(3)

点击蓝字关注我们简介set 是 关联容器 的一种&#xff0c;是排序好的集合&#xff08;元素已经进行了排序&#xff09;。set 和 multiset 类似&#xff0c;它和 multiset 的差别在于 set 中不能有重复的元素。multiset 的成员函数 set 中也都有。使用 set 必须包含 #include<…

检测到基于堆栈的缓冲区溢出_检测到堆栈粉碎

检测到基于堆栈的缓冲区溢出我敢打赌&#xff0c;每个Java开发人员在他们的职业生涯开始时第一次遇到Java代码的本机方法时都会感到惊讶。 我还可以肯定&#xff0c;多年来随着了解JVM如何通过JNI处理对本机实现的调用而使惊奇消失了。 这篇文章是关于本机方法的最新经验。 更…

探讨 C++ 虚函数 virtual

点击蓝字关注我们来源于网络&#xff0c;侵删有无虚函数的对比C 中的虚函数用于解决动态多态问题&#xff0c;虚函数的作用是允许在派生类中重新定义与积累同名的函数&#xff0c;并且可以通过基类指针或引用来访问基类和派生类中的同名函数。首先写两个简单的类&#xff0c;类…

C++ STL详解(4)

点击蓝字关注我们来源于网络&#xff0c;侵删unordered_set / unordered_multiset这两个容器的方法与上一篇 C STL简介&#xff08;3&#xff09; 提到的 set / multiset 基本一样。但是要注意的是&#xff1a;这两个是无序的&#xff0c;基于哈希表实现的&#xff0c;增删改查…

js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%

图像是web上提供的最基本的内容类型之一。他们说一张图片胜过千言万语。但是如果你不小心的话&#xff0c;图片大小有时高达几十兆。因此&#xff0c;虽然网络图像需要清晰明快&#xff0c;但它们尺寸可以缩小压缩的&#xff0c;使用加载时间保持在可接受的水平。在我的网站上&…

春春幼儿园堆积木大赛_春云边车

春春幼儿园堆积木大赛我有一个部署到基于NetflixOSS的云的应用程序&#xff0c;该应用程序具有以下结构&#xff1a; 本质上是一种将信息持久保存到Cassandra集群的服务。 所有应用程序都已注册到Eureka –因此&#xff0c;在本例中&#xff0c;该服务以及Cassandra节点都已在…

C++ 标准输入的行加速

点击蓝字关注我们来源于网络&#xff0c;侵删一、前言c/c 的标准输入函数&#xff0c;在输入一行数据&#xff0c;当数据量比较大的时候&#xff0c; cin 的效率是非常低的&#xff0c;为了加快读入的效率&#xff0c;可以改用 scanf&#xff0c;当然&#xff0c;还有一种利用 …