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 。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。