一、提要
對于官方幫助文件的案例,需要逐一跟蹤代碼,掌握這些技能不很容易,因為這需要多種算子互相搭配,可以說每一個案例都針對一個測量場景,因此,學習halcon不要從一個一個算子做起,而要從案例做起。因為具體問題不同,方法也不同,比如,地圖的邊緣提取,和加工零件的邊緣提取做法有不同,注意這種細節。
二、必要的算子介紹
2.1 dev_set_draw
dev_set_draw 定義區域的填充模式。如果 DrawMode 設置為“filled”,則區域顯示為填充,如果設置為“margin”,則僅顯示輪廓。在 'margin' 模式下,輪廓的外觀會受到 dev_set_line_width、set_line_approx 和 set_line_style 的影響。
1)算子形式
dev_set_draw( : : DrawMode : )
2)參數描述
DrawMode參數兩個選項(“filled”,和 “margin”),設定完后,顯示區域方式就變了,如圖:
.2 area_center
獲得區域的面積和中心位置。
運算符 area_center 計算輸入區域的面積和中心。面積定義為一個區域的像素數。中心分別計算為所有像素的行坐標或列坐標的平均值。如果傳遞了多個區域,則結果存儲在元組中,元組中值的索引對應于輸入區域的索引。在空白區域的情況下,如果沒有設置其他行為,則所有參數的值都為 0.0(參見 set_system)。
1)算子形式
area_center(Regions : : : Area, Row, Column)
2)參數描述
Regions :輸入區域
Area, 區域面積
Row, 行坐標
Column,列坐標
2.3 orientation_region
運算符orientation_region 計算區域的方向。運算符基于 elliptic_axis。此外,計算輪廓上與重心距離最大的點。如果在旋轉坐標系中,該點的列坐標小于重心的列坐標,則將 的值加到角度上。如果傳遞了多個區域,則結果存儲在元組中,元組中值的索引對應于輸入中區域的索引。
1)算子形式
orientation_region(Regions : : : Phi)
2)參數描述
Regions :輸入區域
Phi, 輸出角度,就是區域不對稱的旋轉角度。也就是外接矩形的角
disp_cross (WindowID, RowCenterRegion, ColumnCenterRegion, 15, 0)
disp_arrow (WindowID, RowCenterRegion, ColumnCenterRegion, RowCenterRegion - 60 * sin(OrientationRegion), ColumnCenterRegion + 60 * cos(OrientationRegion), 2)
顯示十字叉、箭頭。
三、邊緣提取算子
edges_sub_pix 使用遞歸實現的濾波器(根據 Deriche、Lanser 和 Shen)或 Canny 提出的傳統實現的“高斯導數”濾波器(使用濾波器掩碼)檢測階梯邊緣。
1)算子形式
edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
2)參數解釋
Image : 輸入圖像
Edges : 輸出邊緣像素
Filter,:算法選擇,可選擇算法是【'deriche1', 'lanser1', 'deriche2', 'lanser2', 'shen', 'mshen', 'canny', 'sobel', and 'sobel_fast'】
Alpha,
Low,
High :
3)參數詳細
edges_sub_pix 使用遞歸實現的濾波器(根據 Deriche、Lanser 和 Shen)或 Canny 提出的傳統實現的“高斯導數”濾波器(使用濾波器掩碼)檢測階梯邊緣。因此,可以使用以下邊緣運算符:“deriche1”、“lanser1”、“deriche2”、“lanser2”、“shen”、“mshen”、“canny”、“sobel”和“sobel_fast”
(參數過濾器)。
提取的邊緣在 Edges 中作為亞像素精確的 XLD 輪廓返回。對于除 'sobel_fast' 之外的所有邊緣運算符,為每個邊緣點定義了以下屬性(參見 get_contour_attrib_xld):
'edge_direction' 邊緣方向
'angle' 法線向量到輪廓的方向(當輪廓從起點到終點遍歷時,法線向量指向輪廓的右側;角度是相對于圖像的行軸給出的) .)
“響應”邊緣幅度(梯度幅度)
除了'sobel'和'sobel_fast'之外的所有邊緣算子的“濾波器寬度”(即平滑量)可以任意選擇,可以通過調用info_edges來估計參數Alpha的具體值。對于所有過濾器(Deriche、Lanser 和 Shen 過濾器),“過濾器寬度”隨著 Alpha 的增加而減小。唯一的例外是 Canny 過濾器,其中增加的 Alpha 也會導致“過濾器寬度”的增加。“寬”濾波器對噪聲表現出更大的不變性,但檢測小細節的能力也有所下降。非遞歸過濾器,例如 Canny 過濾器,是使用過濾器掩碼實現的,因此增加過濾器寬度會增加執行時間。相反,遞歸過濾器的執行時間不取決于過濾器的寬度。因此,使用 Derche、Lanser 和 Shen 過濾器可以實現任意過濾器寬度,而不會增加操作員的運行時間。與 Canny 算子相比,由此產生的速度優勢自然會隨著更大的過濾器寬度而增加。作為邊界處理,遞歸算子假設圖像在圖像之外為零,而 Canny 算子在圖像邊界處重復灰度值。可通過以下 Alpha 選擇獲得可比較的過濾器寬度:
3.2 get_contour_attrib_xld
獲取線段的屬性特征參數值。
1)算子格式
get_contour_attrib_xld(Contour : : Name : Attrib)
2)參數解釋
Contour:輸入曲線對象XLD
Name:屬性名稱,值域為【 'regr_norm_row', 'regr_norm_col', 'regr_mean_dist', 'regr_dev_dist', 'cont_approx', 'bright_dark', 'is_hole'】
Attrib:輸出屬性值,1表示肯定,0表示否定
3)參數詳細
用query_contour_global_attribs_xld(SingleSegment,Attribs)函數可以獲取屬性,只有【cont_approx】一項,因此,其它選項都不能用。
Name參數的值的意義:
cont_approx:有曲率的曲線,此時,Attrib=-1,直線;Attrib=0,橢圓;Attrib=1,圓
四、距離測量項目
4.1 項目描述
在下列工件中,測量出四個圓周的圓心之間距離。項目需要以下知識點:
如何區域生成?
如何邊緣提取?
如何xld生成
如何xld分段?
xld分段如何訪問?
如何獲取曲線特征參數?
如何中心點距離測量?
4.2 參考代碼
read_image (Image, 'metal-parts/metal-parts-01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'light gray', WindowID)
dev_set_draw ('fill')
threshold (Image, Region, 100, 255)
clear_window(WindowID)
disp_region(Region, WindowID)
edges_sub_pix (Image, Edges, 'canny', 0.6, 30, 70)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 6, 4, 4)
dev_clear_window ()
dev_set_colored (12)
dev_display (ContoursSplit)
count_obj (ContoursSplit, NumSegments)
dev_display (Image)
NumCircles := 0
RowsCenterCircle := []
ColumnsCenterCircle := []
for i := 1 to NumSegments by 1
select_obj (ContoursSplit, SingleSegment, i)
get_contour_global_attrib_xld (SingleSegment, 'cont_approx', Attrib)
if (Attrib == 1)
NumCircles := NumCircles + 1
fit_circle_contour_xld (SingleSegment, 'atukey', -1, 2, 0, 5, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1)
RowsCenterCircle := [RowsCenterCircle,Row]
ColumnsCenterCircle := [ColumnsCenterCircle,Column]
dev_display (ContCircle)
endif
endfor
distance_pp (RowsCenterCircle[1], ColumnsCenterCircle[1], RowsCenterCircle[2], ColumnsCenterCircle[2], Distance_2_3)
distance_pp (RowsCenterCircle[0], ColumnsCenterCircle[0], RowsCenterCircle[2], ColumnsCenterCircle[2], Distance_1_3)
distance_pp (RowsCenterCircle[3], ColumnsCenterCircle[3], RowsCenterCircle[4], ColumnsCenterCircle[4], Distance_4_5)
編輯:黃飛
-
濾波器
+關注
關注
160文章
7731瀏覽量
177695 -
算法
+關注
關注
23文章
4600瀏覽量
92649 -
HALCON
+關注
關注
16文章
64瀏覽量
27189
原文標題:halcon案例01 】金屬工件幾何測量
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論