Halcon(Blob分析)ball示例分析

664 阅读7分钟

Halcon(Blob分析)ball示例分析 * ball.hdev: Inspection of Ball Bonding

一,代码解析(重复代码没有列出,完整代码可以参考HDevelop----文件----浏览示例程序---方法---Blob分析----Ball.hdev)  

## 序号## 代码## 解释
## 1## dev_update_window ('off')## update window 在HDevelop开发环境中才会用到,主要控制图形和区域是否自动显示在打开的窗口上面,选择off关闭的话,当需要显示图像和区域时需要使用dev_display算法,联合C#开发不使用
## 2## dev_close_window ()## 关闭程序初始的窗口,有时需要自己定义一个窗口的大小颜色等属性可以关闭当前窗口,新建一个,
## 3## dev_open_window (0, 0, 728, 512, 'black', WindowID)## 新建一个高512,宽728的窗口,背景时黑色,自动输出此窗口的ID
## 4## read_image (Bond, 'die/die_03')## 读取本地本地图片,Bond是存储图片的Hobject变量,后面是路径字符串,'die/die_03'是相对路径,'C:/Users/Public/Documents/MVTec/HALCON-13.0/examples/images/die/die_03.png',是绝对路径(后面详解)
## 5## dev_display (Bond)## 显示read_image算子读取的图片
## 6## set_display_font (WindowID, 14, 'mono', 'true', 'false')## 设置在窗体上显示的文字的格式,在之前创建的window上字体显示是14号字体,黑白,加粗,不倾斜,此条算法是封装函数,在HDevelop中可以看到内部结构
## 7## disp_continue_message (WindowID, 'black', 'true')## 在窗体上显示继续的提示字样,联合C#开发一般不使用,此条算法是封装函数,在HDevelop中可以看到内部结构
## 8## stop ()## 停止执行,相当于断点,在HDevelop中按F5执行到此条停止,需要再此按F5程序继续执行
## 9## threshold (Bond, Bright, 100, 255)## 使用固定灰度值分割图像,Bright为分割后的区域,不是图像,灰度值在100到255之间
## 10## shape_trans (Bright, Die, 'rectangle2')## 根据参数把提取的区域Bright转换成固定的形状,如长方形,带角度的长方形等
## 11## dev_set_color ('green')## 设置在窗体上显示的区域的颜色
## 12## dev_set_line_width (3)## 设置在窗体上显示的区域轮廓的线条宽度
## 13## dev_set_draw ('margin')## 设置在窗体上显示的区域的填充方式,margin 内部不填充,只画边缘,fill填充内部和边缘
## 14## dev_display (Die)## 显示转换后的图像,(dev_display主要用于显示图片和区域)
## 15## reduce_domain (Bond, Die, DieGrey)## threshold提取的只是区域,不是图片,需要裁剪出我们所选择的区域处的图片,reduce_domain算子可以根据区域裁剪对应的图片,此处DieGrey输出的是图片,不是区域
## 16## fill_up_shape (Wires, WiresFilled, 'area', 1, 100)## 因为所选择的区域可能存在孔洞,fill_up_shape根据内部参数,此处为面积在1到100之间的孔洞,直接填充为实体
## 17## opening_circle (WiresFilled, Balls, 15.5)## 属于膨胀,腐蚀,开闭运算中的开运算,此条算子是使用半径为15.5的圆形结构元素对WiresFilled的区域进行开运算(后面详解)
## 18## connection (Balls, SingleBalls)## threshold提取出的区域是一个整体,不管各个区域有没有连在一起,它都被视为一个整体,当我们需要对区域进行筛选时,必须把区域拆分开,这样就可以根据形状,面积等条件筛选出需要的区域,connection是区域进行拆分的算子
## 19## select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)## 对拆分后的区域根据条件筛选,此处的条件是根据和圆的相似程度进行筛选
## 20## sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')## 排序算子,对筛选出的区域进行排序,根据区域所在的行列关系可以排列出先后次序,此处是从小到大(第四个参数如果是false就是从大到小)的顺序,根据列坐标排序,first_point是区域第一行中列值最小的点
## 21## smallest_circle (FinalBalls, Row, Column, Radius)## 定义是一个区域最小的外围圆,此处是因为要检测焊点的大小,本身焊点就类似于圆形,所以主要目的在于求出焊点的圆形尺寸,就可以根据尺寸来筛选好坏,所以需要此算子来求最小外接圆,
## 22## disp_circle (WindowID, Row, Column, Radius)## 根据行列坐标显示出圆形区域
## 23## disp_message (WindowID, 'D: ' + Diameter$'.4', 'image', Row - 2 * Radius, Column, 'white', 'false')## 此条为封装函数,可以根据参数在窗口上根据坐标显示区域的各个参数,属性等,此条在视觉检测中非常有用,联合c#编程时,如果需要保存NG图片,需要在NG图片上显示尺寸,列别等信息,需要用到此条函数


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

二,相关知识解析

相对路径和绝对路径

相对路径使用“/”字符作为目录的分隔字符,而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。

1.绝对路径

绝对路径是指文件在硬盘上真正存在的路径,例如C:\process\file1 这就是绝对路径,指明file1文件在C盘process文件下,从最大的目录C盘开始表示出来

 2.使用绝对路径的缺点

   事实上,在编程时,很少会使用绝对路径,如果使用“E:\book\bg.jpg”来指定背景图片的位置,在自己的计算机上 浏览可能会一切正常,但是上传到Web服务器上浏览就很有可能不会显示图片了。因为上传到Web服务器上时,可能整个网站并没有放在Web服务器的E盘, 有可能是D盘或H盘。即使放在Web服务器的E盘里,Web服务器的E盘里也不一定会存在“E:\book”这个目录,因此在浏 览网页时是不会显示图片的。

3.相对路径

所谓相对路径,就是相对于自己的目标文件位置。 

为了避免绝对路径带来的问题,通常在网页里指定文件时,都会选择使用相对路径。例如上面的例子,“s1.htm” 文件里引用了“bg.jpg”图片,由于“bg.jpg”图片相对于“s1.htm”来说,是在同一个目录的,只要这两个文件的相对位置没有变(也就是说还是在同一个目录内),那么无论上传到Web服务器的哪个位置,在浏览器里都能正确地显示图片。

 

Halcon膨胀腐蚀,开闭运算(主要针对二值图像, 图像中的任何像素灰度值不是0就是255)

注意:如果对灰度图进行膨胀、腐蚀等,会起到增强图像对比度的效果

在联合C#和halcon做视觉检测时,这些我个人而言主要用于处理区域,而不是图像,对区域进行膨胀腐蚀开闭运算后,再进行区域筛选

1)结构元素的形状(圆形,矩形)一般随着要处理的区域形状(圆形、矩形等)的不同而有所不同。比如圆形的结构元素对圆形区域的腐蚀、膨胀效果会更好。 2)结构元素的半径或边长越大,则膨胀、腐蚀效果越强。 3)如果想增加像素,用膨胀或闭运算;如果想减少像素,用腐蚀或开运算。区别在于膨胀和腐蚀的度要大于闭运算和开运算。 4)形态学对二值化区域是改变形状,而对灰度图像是改变图像明暗。 5)开运算一般适合去除边缘毛刺、孔洞等,如果需要对标准圆形或矩形区域四周进行等比例扩大或缩小,可以使用算子dilation_rectangle1、erosion_rectangle1、dilation_circle、erosion_circle算子。

借用“程序大本营中”论坛中的几幅图片说明一下,这几幅图片个人认为充分说明了膨胀腐蚀开闭运算的用法以及什么时候用

 

69bb77059e8c2c6d1677e01ad99ef113.png

 

 

 

  adb5e375e9936bc90a8d411c01228ded.png457958fe9f55ca9a948e4018e18400a0.png

 

 

开运算主要是去除图片中的小的干扰项,闭运算主是填充孔洞等干扰项,这就是与膨胀和腐蚀的大致区别