有了前面的基础后,我们来测试一下如何把程序做的更通用,首先是把初始化的方法修改一下,在初始化的时候传递过去HTuple这个对象(改成了全局的变量,以便于不同的方法调用)

 

其次需要有相机打开/相机关闭,图像保存/图像加载的功能(方便我们快速做测试),前面的相机操作已经讲过了,这里图像的加载也只是套用了前面的加载一个静态图像的功能(把绝对地址改成了参数),保存图像调用了Halcon的WriteImage方法

 

这个方法可以参考范例write_image的这个范例学习(看他导出的C#的程序,稍微修改一下就行了)

 

此外为了防止程序退出的时候控件还在运行导致的报错,所以在窗体关闭的时候需要把类的线程杀掉,那些变量都扔掉

 

如何把模板匹配的内容放过来?我们把范例程序生成的C#代码定位到绘制特征矩形的部分,基本可以照抄这部分内容(绘制矩形,生成矩形)

 

当然绘制完成之后会输出矩形的很多参数,这些变量也要照抄生成的C#代码,这些长宽高,圆周率,面积,角度基本都是HTuple类型,这个类型可以简单理解为浮点数(有时候也表示-0255的byte,或者int等)

 

接下来就到了最重要的部分,其实就两个函数,一个是创建模板,一个是匹配模板(生成的C#代码中在for循环体内部还有一些函数,通过在Halcon执行可以发现他是让图片每次旋转一定的角度然后看作是新的图片,这个跟我们当前的项目没有关系,所以只需要掌握这两条函数即可)

 

Halcon的图像的处理是流程式的,比如A图像是原始图像,先做第一次处理得到B,再做第二次处理得到C,如此往下最后得到我们需要的图像部分。虽然我们不一定完全理解每一种图像处理算法的具体意义,但是只要能理解他的流程会拿过来用即可(这个项目中他最后得到了ho_ImageReduced对象,输出了模板匹配的hv_TempalteID对象)

 

如果你要加深Halcon每一行程序操作之后得到的变量的效果,还是回到Halcon的程序,你每一次F6单步之后可以定位到变量窗口,鼠标放到产生的每一个变量上看他的提示(region是一种变量,image又是一种变量)

 

可以测试下运行结果,先绘制一个矩形框,然后右击结束,确实可以得到X,Y,R,Error

 

那么如何执行动态的匹配呢(假如我们要让相机不停的拍照,也不停的识别特征并对外传出坐标),只要把这部分代码放到死循环里面就行了(还是要做全局的布尔值变量,只在确实模板得到了之后才执行,否则会报错,你的TempalteID都没有实例化),可以测试确实图像在动还是能始终得到数值

 

有一点常识要知道,默认水平是Y坐标,垂直是X坐标,左上角是[0,0]点。所谓的Error是0-255的数值(完全匹配就是0,完全不匹配就是255),此外输出的R是弧度(这些都可以自己测试发现,下图左边是我用手完全遮挡画面的效果,右图是我把相机旋转90度的效果,因为拍的是显示器,显示器不太好动)

 

最后我们再来看一个读写特征匹配模板的功能(你不可能每一次都打开相机-保存图像-浏览图形-设置特征-得到特征匹配ID-自动模式),我们肯定希望匹配了一次之后就把这个所谓的匹配ID保存起来,下次可以直接载入自动运行。Halcon也确实有这样一个范例提供了write_template和read_template方法(保存的文件没有后缀,名字叫做testt,这个有点奇怪,其实就是一个文本文件,2-3M左右大小)

 

有了前面的经验之后,这里可以直接复制生成的C#代码,就一个WriteTempalte方法和ReadTempalte方法,很好理解(我之前写的读写文件方法都必须加类型,这里为了统一起来,也为他设置一个txt的类型)

 

读取模板的时候注意,函数的参数要带ref,所谓的带ref就是函数输入的变量会被修改(详细用法大家可以做几个简单的函数做测试,不带ref是比较常用的,这里如果不带着类的实例的hv_TemplateID并不能得到修改,当然也可以用其他方法来实现)

 

总结:到此为止Halcon和C#的混合编程就介绍完毕了。在工业应用中涉及到算法的东西(比如图像处理,运动控制)很少会用到C#作为最终的执行程序,因为效率比较低。但是这并不妨碍我们用C#作为上层的交互程序,调用别人开发好的DLL,实际上如果用C++来做上层,这些应用层的验证,处理都会比C#麻烦的多。而在整个的图像处理算法中,特征匹配还是非常有用的,你可以把他当做字符识别来用(你抠一个字母A,然后找到图像中所有字母A),也可以作为人脸识别来用(当匹配率低于多少就认为不是同一个人,或者匹配一张脸去掉图像中的这张脸,发现可能的双胞胎之类的)。也可以当做瑕疵检测来用(你抠一个正常产品的样本图片,然后拿着这个样本比对不正常的东西,如果发现误差超过某个数值就认为产品有问题,否则合格)读者需要掌握:

1 常规的视觉系统的操作,基本的像素,二值化,曝光,特征,匹配率的概念

2 Halcon的基本用法,理解优秀软件的设计理念(尤其是这样一种平台级的产品)

3 Halcon+C#的混合编程方法,理解C#最擅长的处理方法,在以后可能的项目中也尝试这种混合编程的思路

 

 

更多教学视频和资料下载,欢迎关注以下信息:

我的优酷空间:

http://i.youku.com/acetaohai123

 

我的在线论坛:

http://csrobot.gz01.bdysite.com/

 

问题交流:

QQ:910358960

邮箱:acetaohai123@163.com

 

 

C#应用视频教程3.4 Halcon+C#测试的更多相关文章

  1. C#应用视频教程3.3 Halcon+C#测试

    接下来我们考虑把Halcon的代码移植到C#程序上,首先找到halcon的dll(.NET类库有1.0,2.0,3.5的,如果你安装了更新版本的halcon则有更新的.NET类库,我们复制最新的dll ...

  2. C#应用视频教程3.2 Halcon软件测试

    Halcon是图像处理比较牛逼的一个软件(德国人的东西,做的非常强大,里面集成的算法很多,可能你一辈子研究这个也做不过他),然而牛逼归牛逼,康耐视,基恩士也很牛逼,但是日本人的东西一般太过封闭,屌丝用 ...

  3. C#应用视频教程3.1 USB工业相机测试

    图像处理是工控很有价值的一个领域,比如人脸识别,车牌识别,还有产品的位置识别,瑕疵检测,对于个人学习来说,我们无法直接上手几万块的成熟工业相机(高端的康耐视要6万左右,而且是黑白的,要测试一些带颜色的 ...

  4. Halcon算子解释

    Halcon算子解释大全 Halcon/Visionpro视频教程和资料,请访问 重码网,网址: http://www.211code.com Chapter 1 :Classification 1. ...

  5. halcon算子

    halcon的算子列表   Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样 ...

  6. halcon的算子列表

    Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...

  7. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  8. Halcon 常用算子使用场合

    Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...

  9. HALCON中的算子大全(中英对照)

    HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...

随机推荐

  1. [POI2015]Wilcze doły

    [POI2015]Wilcze doły 题目大意: 给定一个长度为\(n(n\le2\times10^6)\)的数列\(A(1\le A_i\le10^9)\),可以从中选取不超过\(d\)个连续数 ...

  2. bzoj 1047 单调队列

    做4次单调队列优化DP. /************************************************************** Problem: 1047 User: idy ...

  3. 使用 Nokia Imaging SDK 开发有滤镜功能的 Windows Phone 8 应用

    说到滤镜应用,相信很多数开发者都对照片特效的经验都十分有限,通常都是去找一些三方的类库进行学习或移植,今天在这里给大家介绍下 Nokia 的 Imaging SDK, 相信大家对Nokia的自家图像软 ...

  4. Spring <context:annotation-config/> 解说(转)

    在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredA ...

  5. inux下查看.so和可执行文件是否debug编译的方法

    命令 readelf -S libxxx.so |grep debug   如果有打印信息就是debug,否则是release.

  6. Microsoft Composition (MEF 2)

    This packages provides a version of the Managed Extensibility Framework (MEF) that is lightweight an ...

  7. FT网站开发过程遇到的问题汇总

    1.jar包不兼容问题.主要是mybatis,spring jar包不兼容.同时jstl标签也需要jar包,是jstl.jar,standard.jar. 2.mybatis的mapper.xml映射 ...

  8. 撤销正在审核的app

    一个app还未通过审核,但是新版本已经出来了,怎样才能撤销正在审核的app呢? 方法:在 是binary deatils里用 reject this binary.之后,即可以重新上传代码了.

  9. 【docker】docker基础原理,核心技术简介

    关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...

  10. java中迭代器应用

    本文将利用分析代码的方式,来学习一个集合类的内部结构,以及遍历集合的迭代模式的源码实现细节. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应It ...