有了前面的基础后,我们来测试一下如何把程序做的更通用,首先是把初始化的方法修改一下,在初始化的时候传递过去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