一、提要
對于官方幫助文件的案例,需要逐一跟蹤代碼,掌握這些技能不很容易,因?yàn)檫@需要多種算子互相搭配,可以說每一個(gè)案例都針對一個(gè)測量場景,因此,學(xué)習(xí)halcon不要從一個(gè)一個(gè)算子做起,而要從案例做起。因?yàn)榫唧w問題不同,方法也不同,比如,地圖的邊緣提取,和加工零件的邊緣提取做法有不同,注意這種細(xì)節(jié)。
二、必要的算子介紹
2.1 dev_set_draw
dev_set_draw 定義區(qū)域的填充模式。如果 DrawMode 設(shè)置為“filled”,則區(qū)域顯示為填充,如果設(shè)置為“margin”,則僅顯示輪廓。在 'margin' 模式下,輪廓的外觀會(huì)受到 dev_set_line_width、set_line_approx 和 set_line_style 的影響。
1)算子形式
dev_set_draw( : : DrawMode : )
2)參數(shù)描述
DrawMode參數(shù)兩個(gè)選項(xiàng)(“filled”,和 “margin”),設(shè)定完后,顯示區(qū)域方式就變了,如圖:
.2 area_center
獲得區(qū)域的面積和中心位置。
運(yùn)算符 area_center 計(jì)算輸入?yún)^(qū)域的面積和中心。面積定義為一個(gè)區(qū)域的像素?cái)?shù)。中心分別計(jì)算為所有像素的行坐標(biāo)或列坐標(biāo)的平均值。如果傳遞了多個(gè)區(qū)域,則結(jié)果存儲(chǔ)在元組中,元組中值的索引對應(yīng)于輸入?yún)^(qū)域的索引。在空白區(qū)域的情況下,如果沒有設(shè)置其他行為,則所有參數(shù)的值都為 0.0(參見 set_system)。
1)算子形式
area_center(Regions : : : Area, Row, Column)
2)參數(shù)描述
Regions :輸入?yún)^(qū)域
Area, 區(qū)域面積
Row, 行坐標(biāo)
Column,列坐標(biāo)
2.3 orientation_region
運(yùn)算符orientation_region 計(jì)算區(qū)域的方向。運(yùn)算符基于 elliptic_axis。此外,計(jì)算輪廓上與重心距離最大的點(diǎn)。如果在旋轉(zhuǎn)坐標(biāo)系中,該點(diǎn)的列坐標(biāo)小于重心的列坐標(biāo),則將 的值加到角度上。如果傳遞了多個(gè)區(qū)域,則結(jié)果存儲(chǔ)在元組中,元組中值的索引對應(yīng)于輸入中區(qū)域的索引。
1)算子形式
orientation_region(Regions : : : Phi)
2)參數(shù)描述
Regions :輸入?yún)^(qū)域
Phi, 輸出角度,就是區(qū)域不對稱的旋轉(zhuǎn)角度。也就是外接矩形的角
disp_cross (WindowID, RowCenterRegion, ColumnCenterRegion, 15, 0)
disp_arrow (WindowID, RowCenterRegion, ColumnCenterRegion, RowCenterRegion - 60 * sin(OrientationRegion), ColumnCenterRegion + 60 * cos(OrientationRegion), 2)
顯示十字叉、箭頭。
三、邊緣提取算子
edges_sub_pix 使用遞歸實(shí)現(xiàn)的濾波器(根據(jù) Deriche、Lanser 和 Shen)或 Canny 提出的傳統(tǒng)實(shí)現(xiàn)的“高斯導(dǎo)數(shù)”濾波器(使用濾波器掩碼)檢測階梯邊緣。
1)算子形式
edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
2)參數(shù)解釋
Image : 輸入圖像
Edges : 輸出邊緣像素
Filter,:算法選擇,可選擇算法是【'deriche1', 'lanser1', 'deriche2', 'lanser2', 'shen', 'mshen', 'canny', 'sobel', and 'sobel_fast'】
Alpha,
Low,
High :
3)參數(shù)詳細(xì)
edges_sub_pix 使用遞歸實(shí)現(xiàn)的濾波器(根據(jù) Deriche、Lanser 和 Shen)或 Canny 提出的傳統(tǒng)實(shí)現(xiàn)的“高斯導(dǎo)數(shù)”濾波器(使用濾波器掩碼)檢測階梯邊緣。因此,可以使用以下邊緣運(yùn)算符:“deriche1”、“l(fā)anser1”、“deriche2”、“l(fā)anser2”、“shen”、“mshen”、“canny”、“sobel”和“sobel_fast”
(參數(shù)過濾器)。
提取的邊緣在 Edges 中作為亞像素精確的 XLD 輪廓返回。對于除 'sobel_fast' 之外的所有邊緣運(yùn)算符,為每個(gè)邊緣點(diǎn)定義了以下屬性(參見 get_contour_attrib_xld):
'edge_direction' 邊緣方向
'angle' 法線向量到輪廓的方向(當(dāng)輪廓從起點(diǎn)到終點(diǎn)遍歷時(shí),法線向量指向輪廓的右側(cè);角度是相對于圖像的行軸給出的) .)
“響應(yīng)”邊緣幅度(梯度幅度)
除了'sobel'和'sobel_fast'之外的所有邊緣算子的“濾波器寬度”(即平滑量)可以任意選擇,可以通過調(diào)用info_edges來估計(jì)參數(shù)Alpha的具體值。對于所有過濾器(Deriche、Lanser 和 Shen 過濾器),“過濾器寬度”隨著 Alpha 的增加而減小。唯一的例外是 Canny 過濾器,其中增加的 Alpha 也會(huì)導(dǎo)致“過濾器寬度”的增加。“寬”濾波器對噪聲表現(xiàn)出更大的不變性,但檢測小細(xì)節(jié)的能力也有所下降。非遞歸過濾器,例如 Canny 過濾器,是使用過濾器掩碼實(shí)現(xiàn)的,因此增加過濾器寬度會(huì)增加執(zhí)行時(shí)間。相反,遞歸過濾器的執(zhí)行時(shí)間不取決于過濾器的寬度。因此,使用 Derche、Lanser 和 Shen 過濾器可以實(shí)現(xiàn)任意過濾器寬度,而不會(huì)增加操作員的運(yùn)行時(shí)間。與 Canny 算子相比,由此產(chǎn)生的速度優(yōu)勢自然會(huì)隨著更大的過濾器寬度而增加。作為邊界處理,遞歸算子假設(shè)圖像在圖像之外為零,而 Canny 算子在圖像邊界處重復(fù)灰度值??赏ㄟ^以下 Alpha 選擇獲得可比較的過濾器寬度:
3.2 get_contour_attrib_xld
獲取線段的屬性特征參數(shù)值。
1)算子格式
get_contour_attrib_xld(Contour : : Name : Attrib)
2)參數(shù)解釋
Contour:輸入曲線對象XLD
Name:屬性名稱,值域?yàn)椤?'regr_norm_row', 'regr_norm_col', 'regr_mean_dist', 'regr_dev_dist', 'cont_approx', 'bright_dark', 'is_hole'】
Attrib:輸出屬性值,1表示肯定,0表示否定
3)參數(shù)詳細(xì)
用query_contour_global_attribs_xld(SingleSegment,Attribs)函數(shù)可以獲取屬性,只有【cont_approx】一項(xiàng),因此,其它選項(xiàng)都不能用。
Name參數(shù)的值的意義:
cont_approx:有曲率的曲線,此時(shí),Attrib=-1,直線;Attrib=0,橢圓;Attrib=1,圓
四、距離測量項(xiàng)目
4.1 項(xiàng)目描述
在下列工件中,測量出四個(gè)圓周的圓心之間距離。項(xiàng)目需要以下知識點(diǎn):
如何區(qū)域生成?
如何邊緣提???
如何xld生成
如何xld分段?
xld分段如何訪問?
如何獲取曲線特征參數(shù)?
如何中心點(diǎn)距離測量?
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)
編輯:黃飛
-
濾波器
+關(guān)注
關(guān)注
161文章
7859瀏覽量
178675 -
算法
+關(guān)注
關(guān)注
23文章
4629瀏覽量
93186 -
HALCON
+關(guān)注
關(guān)注
16文章
66瀏覽量
27267
原文標(biāo)題:halcon案例01 】金屬工件幾何測量
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論