C#应用视频教程3.4 Halcon+C#测试
有了前面的基础后,我们来测试一下如何把程序做的更通用,首先是把初始化的方法修改一下,在初始化的时候传递过去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
C#应用视频教程3.4 Halcon+C#测试的更多相关文章
- C#应用视频教程3.3 Halcon+C#测试
接下来我们考虑把Halcon的代码移植到C#程序上,首先找到halcon的dll(.NET类库有1.0,2.0,3.5的,如果你安装了更新版本的halcon则有更新的.NET类库,我们复制最新的dll ...
- C#应用视频教程3.2 Halcon软件测试
Halcon是图像处理比较牛逼的一个软件(德国人的东西,做的非常强大,里面集成的算法很多,可能你一辈子研究这个也做不过他),然而牛逼归牛逼,康耐视,基恩士也很牛逼,但是日本人的东西一般太过封闭,屌丝用 ...
- C#应用视频教程3.1 USB工业相机测试
图像处理是工控很有价值的一个领域,比如人脸识别,车牌识别,还有产品的位置识别,瑕疵检测,对于个人学习来说,我们无法直接上手几万块的成熟工业相机(高端的康耐视要6万左右,而且是黑白的,要测试一些带颜色的 ...
- Halcon算子解释
Halcon算子解释大全 Halcon/Visionpro视频教程和资料,请访问 重码网,网址: http://www.211code.com Chapter 1 :Classification 1. ...
- halcon算子
halcon的算子列表 Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样 ...
- halcon的算子列表
Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- Halcon 常用算子使用场合
Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...
- HALCON中的算子大全(中英对照)
HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...
随机推荐
- hdu 5301 Buildings (2015多校第二场第2题) 简单模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...
- 【洛谷】1477:[NOI2008]假面舞会【图论】
P1477 [NOI2008]假面舞会 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...
- bzoj 3240 矩阵乘法+十进制快速幂
首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...
- C++之lambda理解
简介 在C++ Primer中,是这样定义的-一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数:与任何函数类似,一个lambda具有一个返回类型,一个参数列表和一个函 ...
- trigger、procedure和event如何同步
最近遇到一个需求涉及存储过程,被突然问题到如何同步问题问到了,赶紧补课学习一下. 首先,先看一下trigger.procedure和event的定义都是什么? trigger: 触发器是一个被指定关联 ...
- js面向对象写页面
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java并发基础(二)
<java并发编程实战>终于读完4-7章了,感触很深,但是有些东西还没有吃透,先把已经理解的整理一下.java并发基础(一)是对前3章的总结.这里总结一下第4.5章的东西. 一.java监 ...
- Ext BoxComponent
Ext.BoxComponent也是一个比较重要的基础类,它直接继承自Ext.Component,并实现了定位和控制自身大小的功能. 可以使用pageX.pageY.x.y为Ext.BoxCompon ...
- wpf z
Finding an ancestor of a WPF dependency object This is a simple snippet which helps you to find a sp ...
- apt-get无法下载,一些网址Not Found 404
apt-get无法下载,网址报 Not Found 404,原因是apt软件下载源有问题. 1.将/etc/apt/source.list里的内容替换. 在其他能够下载apt的ubuntu机器中拷贝过 ...