HALCON示例程序count_fish_sticks.hdev魚棒完整性檢測
示例程序源碼(加注釋)
- 關于顯示類函數解釋
dev_update_off ()
dev_close_window ()
read_image (Image, ‘food/fish_stick_package_01’)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width * .9, Height * .9, ‘black’, WindowHandle)
set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)
dev_set_draw (‘margin’)
dev_open_window (0, Width * .9 + 12, 420, 150, ‘black’, GraphicsWindow)
set_display_font (GraphicsWindow, 16, ‘mono’, ‘true’, ‘false’)
dev_set_color (‘yellow’) - 讀入圖片
NumImages := 6
for Index := 1 to NumImages by 1
read_image (Image, ‘food/fish_stick_package_’ + Index$‘02’)- 二值化
threshold (Image, Region, 100, 255) - 使用圓形元素進行閉運算
closing_circle (Region, RegionClosing, 5) - 填充孔洞
fill_up (RegionClosing, RegionFillUp) - 求取區域不想交部分
difference (RegionFillUp, RegionClosing, RegionDifference) - 填充孔洞
fill_up (RegionDifference, RegionFillUp1) - 使用圓形元素進行閉運算
closing_circle (RegionFillUp1, RegionClosing1, 10) - 求取區域的可旋轉的最小外接矩形
smallest_rectangle2 (RegionClosing1, Row, Column, Phi, Length1, Length2)
MeasureLength1 := Length1 - 5 - 生成一個可旋轉矩形框
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, 80) - gen_measure_rectangle2提取垂直于矩形的直邊。
- gen_measure_rectangle2(::行坐標,列坐標,角度,矩形長度/2,矩形寬度/2,測量寬度,測量高度,算法:測量句柄)
gen_measure_rectangle2 (Row, Column, Phi, MeasureLength1, 60, Width, Height, ‘nearest_neighbor’, MeasureHandle) - measure_projection - 提取垂直于矩形或環形弧的一維灰度值輪廓。
- measure_projection(圖片:: 測量句柄:灰度值)
measure_projection (Image, MeasureHandle, GrayValues) - 關閉測量句柄
close_measure (MeasureHandle) - create_funct_1d_array - 從一系列y值創建一個函數。
- create_funct_1d_array(::: Y值:函數)
create_funct_1d_array (GrayValues, Function) - local_min_max_funct_1d - 計算函數的局部最小點和最大點。
- local_min_max_funct_1d(::功能,模式,插值:最小,最大)
local_min_max_funct_1d (Function, ‘plateaus_center’, ‘true’, Minima, Maxima) - get_y_value_funct_1d - 返回指定X位置的函數Y的值。
- get_y_value_funct_1d(::函數,X位置,邊界處理方法:Y的值)
get_y_value_funct_1d (Function, Minima, ‘mirror’, YValues) - 這句話的所有關于數組操作的算子解釋貼子,這句話就是篩選局部最小值低于50的點。
SelectedMinima := subset(Minima,find(sgn(YValues - 50),-1))
Num := |SelectedMinima| + 1
StickEdges := [-5,SelectedMinima,2 * MeasureLength1 + 5]
StickWidth := StickEdges[1:Num] - StickEdges[0:Num - 1] - 計算每個魚塊的中心點與邊界,并畫X
BorderX := Column + cos(Phi) * (MeasureLength1 * ((StickEdges - MeasureLength1) / MeasureLength1))
BorderY := Row - sin(Phi) * (MeasureLength1 * ((StickEdges - MeasureLength1) / MeasureLength1))
CenterX := (BorderX[1:Num] + BorderX[0:Num - 1]) / 2
CenterY := (BorderY[1:Num] + BorderY[0:Num - 1]) / 2
gen_cross_contour_xld (BorderCross, BorderY, BorderX, 15, rad(45))
gen_cross_contour_xld (CenterCross, CenterY, CenterX, 15, rad(45)) - 篩選大于20小于48的魚塊
IndexFish := find(sgn(StickWidth - 20),1)
if (IndexFish != -1)
NumFish := |IndexFish|
gen_rectangle2 (FishRegions, subset(CenterY,IndexFish), subset(CenterX,IndexFish), gen_tuple_const(NumFish,Phi), subset(StickWidth,IndexFish) / 2, gen_tuple_const(NumFish,Length2) / 2)
else
NumFish := 0
endif
gen_empty_region (Flipped)
IndexFlipped := find(sgn(StickWidth - 48),1)
if (IndexFlipped != -1)
NumFlipped := |IndexFlipped|
gen_rectangle2 (Flipped, subset(CenterY,IndexFlipped), subset(CenterX,IndexFlipped), gen_tuple_const(NumFlipped,Phi), subset(StickWidth,IndexFlipped) / 2, gen_tuple_const(NumFlipped,Length2) / 2)
else
NumFlipped := 0
endif - 顯示結果
dev_set_window (GraphicsWindow)
dev_clear_window () - plot_funct_1d - 此過程繪制表示坐標系中函數或曲線的元組。這個不是很常用。
plot_funct_1d (GraphicsWindow, Function, [], [], ‘yellow’, ‘axes_color’, ‘none’)
disp_message (GraphicsWindow, ‘Gray Profile’, ‘window’, 12, 12, ‘white’, ‘false’)
dev_set_window (WindowHandle)
dev_clear_window ()
dev_display (Image)
dev_set_color (‘yellow’)
dev_set_line_width (1)
dev_display (FishRegions)
dev_display (BorderCross)
dev_set_color (‘red’)
dev_set_line_width (3)
dev_display (Flipped)
if (NumFish == 15 and NumFlipped == 0)
String := ‘OK’
Color := ‘green’
else
String := ‘Not OK’
Color := ‘red’
endif
String[1] := ‘Number of fish sticks:’ + NumFish′3′if(NumFish!=15)Color:=[Color,′red′]elseColor:=[Color,′white′]endifif(NumFlipped!=0)String[2]:=′Flippedfishsticks:′+NumFlipped'3' if (NumFish != 15) Color := [Color,'red'] else Color := [Color,'white'] endif if (NumFlipped != 0) String[2] := 'Flipped fishsticks: ' + NumFlipped′3′if(NumFish!=15)Color:=[Color,′red′]elseColor:=[Color,′white′]endifif(NumFlipped!=0)String[2]:=′Flippedfishsticks:′+NumFlipped’3’
Color := [Color,‘red’]
endif
disp_message (WindowHandle, String, ‘window’, 12, 12, Color, ‘false’)
dev_set_color (Color[0])
dev_display (Rectangle)
if (Index < NumImages)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop ()
endif
endfor
- 二值化
處理思路
這個例子是主要講解了二維測量的方法。使用的是gen_measure_rectangle2、measure_projection、create_funct_1d_array 、local_min_max_funct_1d、get_y_value_funct_1d完成的測量,當然后續會有更簡單的直觀的方法。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。