halcon显示坐标_机器视觉之halcon入门(10)-一文弄懂halcon例程:color_fuse.hdev

第五节 halcon例程2: color_fuses.hdev

到目前为止,我们图片大多都是对单通道的图片,即黑白图片进行处理,工业上也是对黑白图片的应用处理偏多一点,但这不代表彩色图片没用啊,彩色图片毕竟三个通道,有的地方还非彩色图片不行的,比如本例。本例程的目的是根据颜色来给图片中的fuses进行归类,并显示每一类数目。代码中新算子不是很多,但是老实说,新手想读懂还是有点难度。

话不多说,我们进入讲解。首先你得找到这个例程哈。例程的思路还是很明确的,本例共有五种颜色的fuse,每种颜色在hue(色度空间)的值不一样,所以通过这个来区分。分开后吗,再数一下数目,再显示出来就可以了。

进入代码讲解,如下图(3-5-1):

halcon显示坐标_机器视觉之halcon入门(10)-一文弄懂halcon例程:color_fuse.hdev_第1张图片

图 3-5-1

不要一看全是褐色的代码,就简单认为全是开关图形窗口,设置颜色等,其实还有一些比较关键的代码也是褐色,比如参数的赋值和运算。本例中就赋值了几个数组:FuseColors:就是fuse的颜色数组,FuseTypes是fuse的种类?具体干嘛的我也不知道,跟颜色的意思差不多,用来区分的。HueRanges是指每种颜色在hue空间的幅值范围。比如前面两个10,30就是说橙色在hue空间的值在10-30之间,后面的以此类推。这个幅值很关键,不弄懂,后面容易看不明白。Count就是下面的for循环的计数了。其它的就没什么好讲解的了。进入下一段,如下图(3-5-2):

halcon显示坐标_机器视觉之halcon入门(10)-一文弄懂halcon例程:color_fuse.hdev_第2张图片

图 3-5-2

首先是读取一张图片,老实说,背景还是挺干净的,也是为了方便筛选。接下来的

set_tposition (WH, 12, 512):设置光标的位置,这个位置的名称就叫WH(我老家芜湖的缩写),位置的纵横坐标就是后面的两个参数,一般光标设置完,接下来就是要在这个位置写字了。

write_string (WH, 'color/color_fuses0' + Count + '.png'):你看,我没骗你吧,这就是在光标位置写字的算子,第一个参数是光标的名称,第二个参数是要写的文字,记不记得前面讲过一种写字的算子?忘记了的话自己往前翻吧,两个算子还是有点不一样的,你们自己对比下。

这两步其实就是写点东西,真正的图像处理从接下来开始:例程先把这张三通道的Image分成了R、G、B三个单通道的图片,然后再转换到HSV空间,因为上面说到在Hue空间每种颜色的幅值范围会不一样,比较好筛选。接下来两步是在Saturation空间选出要辨别颜色的区域,再在hue空间把这块区域抠出来(即HueSaturated),不让其它区域来干扰我们。这也体现了程序思维的缜密性,是我们需要学习的地方。

到了这一步基本上,我们可以进行筛选了,因为有五种颜色的fuse,所以每张图片要筛选五次,在10-30内的是橙色,在0-10就是红色,以此类推,如果是我们来写,可能5次归类要写5遍,人家巧妙的用上面定义的HueRanges数组合并了同样的步骤,所以这个thrashold算子里面的最后两个参数是:HueRanges[Fuse * 2]和 HueRanges[Fuse * 2 + 1],Fuse表示从0-4的for循环次数,所以每次循环到这儿就对应了不同的颜色在Hue空间幅值范围,刚好一一筛选出来了。拿第一次循环为例,Fuse=0,threshold后面两个参数是HueRanges[0*2]和HueRanges[0*2+1],就是10跟30,单步执行到这儿就可以看出来,图片筛选出了红色fuse的区域,如下图(3-5-3):

halcon显示坐标_机器视觉之halcon入门(10)-一文弄懂halcon例程:color_fuse.hdev_第3张图片

图 3-5-3

再进行一些常规的图像处理:连通域,填充孔洞,选出面积在6000-20000之间的区域(CurrentFuseSel)。这几行代码都是老生常谈的了,我必须一笔带过。。。然后再求一下这个区域(CurrentFuseSel)的面积和中心点坐标。然后弄了个我也不认识且懒得有道的颜色,又进行一次小循环,这个循环的目的就是显示一大堆话,比如颜色,种类,在我找到的那个fuse中心位置开始写,看懂这个for循环的关键是看懂"|FuseArea|-1"。对,它是根据上面选出来的CurrentFuseSel,有多少个就显示多少个,且分别在每个单独的区域位置中心显示这些参数。显示完这些,他们还不满足,还要再在图片的左上角总的显示一下每种颜色的fuse的个数,但是五种fuse的输入位置不能重叠了嘛,程序里面也利用for循环的因子fuse,在set_tposition算子里面巧妙的合并了代码,避免设置5个光标,的确有点小机智。

这样就算归类完一张图片了。Count++,然后再循环。为了避免for循环太多,容易看错,程序竟然还用了一个while循环来避免重复。实在是暖心。

说实话,本例程中的新算子真的有点少,主要就是

1)set_tposition (WH, 24 * (Fuse + 1), 12)

2)write_string (WH, FuseColors[Fuse] + ' Fuses: ' + |FuseArea|)

这两个大多数情况下还是连用的,设置下光标,然后在光标处写字。但是本例程对数组和for循环的运用,还是很值得我们学习的。代码得到了很大的简化,还有就是前面讲到的reduce_domain那一段。都是我们需要借鉴的。如果有读者觉得这一段代码比较简单,可以自己写一下看看。另外就是既然是颜色不同,那每种颜色的rgb肯定也是不一样的,是不是可以通过三个单通道的R、G、B图像进行筛选再求交集最后得出不同的颜色区分呢?这一段就留给读者自己去思考和发散了!

本节TIPS:

是的,这一节的TIPS是我硬加的,因为我写完几乎整本书的初稿,回头整理的时候发现这一节竟然没有"本节TIPS",目录上就显得很尴尬。所以我生加了一个"本节TIPS",虽然你读到这儿会更尴尬

ed1f0eca189a515e0daa29840af7521a.png

。哈哈,没想到我会真的这么坑吧?算了,还是说几点吧!

1)halcon里面的角度是怎么规定的呢?我们知道halcon里面的矩形有两种,2型的就是带角度的,很多线,region都是有角度的,这个角度的分布是怎样的呢?如下图(3-5-4):

halcon显示坐标_机器视觉之halcon入门(10)-一文弄懂halcon例程:color_fuse.hdev_第4张图片

图 3-5-4

1) 字符操作的时候通常有四种操作,"与","或","非","异或",那这些在halcon里面怎么操作呢?如下图(3-5-5):

halcon显示坐标_机器视觉之halcon入门(10)-一文弄懂halcon例程:color_fuse.hdev_第5张图片

图 3-5-5

F1帮助里面搜索"bit"即可以查找到啦!

你可能感兴趣的:(halcon显示坐标)