HALCON示例程序check_hazelnut_wafers.hdev威化饼干质量检测(完整与否,是否破碎)
示例程序源码(加注释)
-
读入图片
read_image (Image, ‘food/hazelnut_wafer_01’)
-
关闭窗口
dev_close_window ()
-
根据给定的长宽比打开窗口
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
-
关闭图像实时更新
dev_update_window (‘off’)
-
显示线宽设置为3
dev_set_line_width (3)
-
区域显示方式为边缘模式
dev_set_draw (‘margin’)
-
设置字体显示格式
set_display_font (WindowHandle, 20, ‘mono’, ‘true’, ‘false’)
-
循环检测
for Index := 1 to 24 by 1
- 读入图片
read_image (Image, ‘food/hazelnut_wafer_’ + Index$’.02’) - binary_threshold - 使用二进制阈值分割图像
- 函数原型:binary_threshold(Image:Region:Method,LightDark:UsedThreshold)
- Image:输入图像;Region:输出区域;Method:分割方法;
- LightDark:选取亮区还是暗区;UsedThreshold:返回分割时使用的阈值
- https://www.cnblogs.com/baiyy-daheng/p/8931931.html
方法一:扫描图像的每个像素值,值小于127的将像素值设为0(黑色),
值大于等于127的像素值设为255(白色)。该方法的好处是计算量少速度快。
方法二:计算像素的平均值K,扫描图像的每个像素值如像素值大于K像素值设为255(白色),
值小于等于K像素值设为0(黑色)。
方法三:使用直方图方法来寻找二值化阈值,直方图是图像的重要特质,
直方图方法选择二值化阈值主要是发现图像的两个最高的峰,
然后在阈值取值在两个峰之间的峰谷最低处。
binary_threshold (Image, Foreground, ‘smooth_histo’, ‘light’, UsedThreshold) - 对选取区域使用圆形区域进行开运算
opening_circle (Foreground, FinalRegion, 8.5) - area_holes - 计算区域的孔面积。
area_holes (FinalRegion, AreaHoles) - 求取区域的矩形度。
rectangularity (FinalRegion, Rectangularity)
dev_display (Image) - 如果孔洞过多面积超过300或者矩形度小于0.92,认为破损。
if (AreaHoles > 300 or Rectangularity < 0.92)
dev_set_color (‘red’)
Text := ‘Not OK’
else
dev_set_color (‘forest green’)
Text := ‘OK’
endif
dev_display (FinalRegion)
disp_message (WindowHandle, Text, ‘window’, -1, -1, ‘’, ‘false’)
if (Index < 24)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop ()
endif
endfor
处理思路
这个例子的思路非常简单,二值化求取饼干区域,对饼干求取孔洞面积与矩形度,通过这两个参数实现饼干的筛选。一个新的阈值分割方法binary_threshold 。学习到了求取孔洞面积的直接方法area_holes 。求取矩形度算子rectangularity 。
后记
大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。