Halcon · 曲線寬度檢測演算法總結

啟林Ltd 發表於 2022-06-27
演算法

視覺檢測中,直線的寬度很好檢測,即兩條平行線的垂直距離,而曲線的寬度檢測則需要另闢蹊徑。

檢測影像中曲線邊緣的寬度,用以判斷邊緣是否崩缺,總結如下五種方法:

1.影像匹配判斷

概述:建立標準影像參考,通過比對檢測結果。

核心運算元:

(1)參考:align_bead;

(2)檢測:apply_bead_inspection_model;

參考Halcon例程:apply_bead_inspection_model.hdev。

該方法較適用於膠水檢測,因為無法方便地獲取崩缺的值,因而棄用,但具有參考價值,建議學習。

2.點到輪廓的距離

概述:通過二值化提取Border(邊緣),提取其中一條邊緣的點陣,計算該點陣的所有點到另一條邊緣的距離。

核心運算元:

(1)獲取邊緣上的點陣:get_contour_xld(Contour : : : Row, Col);

(2)計算點陣到邊緣的距離:distance_pc(Contour : : Row, Column : DistanceMin, DistanceMax)

參考Halcon例程:distance_pc.hdev。

參考程式碼:

*二值化找Border
threshold_sub_pix(ImageReducedM1,Border, 130)
count_obj(Border,Number)
*建立陣列,按長度拍排序Border
LengthTuple:=[]
for i:=1 to Number by 1    
select_obj (Border,  ObjectSelected, i)
length_xld(ObjectSelected,length)
LengthTuple:=[LengthTuple,length]
endfor
tuple_sort_index(LengthTuple,Indices)
*找出兩條最長的輪廓
if(|Indices|>1)
select_obj(Border,MaxXLD,Indices[|Indices|-1]+1)
select_obj(Border,NextXLD,Indices[|Indices|-1-1]+1)
else
    return()
endif  
*獲取最長輪廓的點陣
get_contour_xld(MaxXLD, Rows1, Columns1)
*計算點陣到另一個輪廓的距離
distance_pc(NextXLD,Rows1, Columns1, DistanceMin, DistanceMax)

注意:運算元 distance_pc 輸出兩個陣列,分別為最小距離陣列,最大距離陣列,取值時應取最小距離陣列。

3.輪廓與輪廓的距離

概述:通過二值化提取一對Contours(輪廓),計算兩條輪廓之間的距離。

核心運算元:

(1)計算輪廓之間的距離:distance_contours_xld(ContourFrom, ContourTo : ContourOut : Mode : );

(2)獲取寬度值集合:get_contour_attrib_xld(Contour : : Name : Attrib);

(3)提取OK/NG片段:segment_contour_attrib_xld(Contour : ContourPart : Attribute, Operation, Min, Max : )

參考Halcon例程:

(1)inspect_frame_width.hdev;

(2)Apply_distance_transform_xld.hdev。

參考程式碼:

*測量兩條曲線之間的寬度
distance_contours_xld (MaxXLD, NextXLD, ContourOut, 'point_to_segment')
get_contour_attrib_xld (ContourOut, 'distance', Distance)
*提取測量寬度集中合規的部分
segment_contour_attrib_xld (ContourOut, ContourPart, 'distance', 'and', 10, 26)
display_result (MaxXLD, NextXLD, ContourPart)
*取最大值
tuple_max (Distance, WidthMax)
tuple_min (Distance, WidthMin)

4.提取骨架測量寬度

概述:提取曲線的中心骨架,再通過骨架測量曲線寬度。

核心運算元:

(1)計算lines_gauss運算元所需輸入引數:calculate_lines_gauss_parameters( : : MaxLineWidth, Contrast : Sigma, Low, High);

(2)檢測骨架及其寬度:lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )。

參考Halcon例程:

(1)angio.hdev;

(2)lines_gauss.hdev。

5.極座標展開曲線影像

概述:將曲線影像按極座標展開,檢測展開後的影像,再將結果影像恢復直角座標影像。

核心運算元:

(1)影像轉極座標:polar_trans_image;

(2)影像轉直角座標:polar_trans_region_inv。

參考Halcon例程:

(1)ocr_cd_print_polar_trans.hdev;

(2)vessel.hdev。