天天看點

Halcon找圓系列(1)如何檢測圓形

一、HALCON 12.0例程裡有一個類似的,Ctrl+E打開例程,搜關鍵字“circle”或者"ball"就行。

請重點關注下measure_circles.hdev,circles.hdev,union_cocircular_contours_xld.hdev,ball.hdev這幾個例程。

大概過程差不多是:找到圓形區域--亞像素邊緣--結果曲線分段--篩選出圓形--拟合

二、要測量一個圓的直徑,可以先通過門檻值篩選出黑色部分threshold (Rim, Dark, 0, 128),

然後将選中部分組合connection (Dark, DarkRegions),選擇其中類圓度高的部分根據選中部分與圓的相似度篩選出圓型部分select_shape (DarkRegions, Circles, ['circularity','area'], 'and', [0.85,50], [1.0,99999]),

然後選擇将所選的類圓區域擴大8.5個像素點作為一個區域,縮小8.5個像素點作為一個區域,然後将連個區域合并,去兩個區域不同的部分,那麼這個圓區域的邊緣就在這個合并區域中,算子如下:

dilation_circle (Circles, ROIOuter, 8.5)

erosion_circle (Circles, ROIInner, 8.5)

difference (ROIOuter, ROIInner, ROI)

union1 (ROI, ROIEdges)

這時我們在用算子edges_sub_pix (RimReduced, Edges, 'lanser2', 0.3, 10, 20)提取其邊緣輪廓。

用一個橢圓去近似它(這個圓形區域畢竟不是真正的圓,需要進行拟合)fit_ellipse_contour_xld (RelEdges, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder)進而得到這個區域的中點坐标 Row, Column,與x軸的角度Phi,半長軸Ra,半短軸Rb,開始角度StartPhi,結束角度EndPhi,這是就可以計算圓的近似半徑了。

例子1

dev_clear_window()
dev_close_window()
read_image (read_Image, 'C:/Users/Leason/Desktop/試驗/2.jpg')
rgb1_to_gray (read_Image, Image)
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width/3, Height/3, WindowHandle)
dev_display (Image)
gen_rectangle1 (ROI, 239.876, 8.5, 513.303, 695.5)
reduce_domain (Image, ROI, ImageReduced)
threshold (ImageReduced, ROI, 80, 255)
connection (ROI, DarkRegions)
select_shape (DarkRegions, Circles, ['circularity','area'], 'and', [0.85,50], [1.0,99999])
count_obj (Circles, Number)//計算圓形的數量
select_obj (Circles, PillSelected,1)
dilation_circle (Circles, ROIOuter, 4)
erosion_circle (Circles, ROIInner, 2)
difference (ROIOuter, ROIInner, ROI_dif)
union1 (ROI_dif, ROIEdges)
reduce_domain (ImageReduced, ROIEdges, ImageReduced1)
*提取其邊緣輪廓
edges_sub_pix (ImageReduced1, Edges, 'lanser2', 0.3, 10, 20)
*區域的中點坐标Row, Column,與x軸的角度Phi,半長軸Ra,半短軸Rb,開始角度StartPhi,結束角度EndPhi
fit_ellipse_contour_xld (Edges, 'ftukey', -1, 2, 0, 200, 3, 2, Row, Column, Phi, Ra, Rb, StartPhi, EndPhi, PointOrder)      

例子2

read_image (Image, 'C:/Users/caiqi/Desktop/halcon計劃/測量/_4.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_colored (12)
dev_set_line_width (2)
dev_set_draw ('fill')
fast_threshold (Image, Region, 200, 255, 20)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
boundary (SelectedRegions, RegionBorder, 'inner_filled')
dev_clear_window ()
dev_display (RegionBorder)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
edges_sub_pix (Image, Edges, 'canny', 1, 10, 40)
fit_circle_contour_xld (Edges, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1)      

三、邊緣提取

1、設定ROI興趣區域

2、快速二值化,并連接配接相鄰區域。

這樣做的目的是進一步減少目标區域,通過二值化将目标區域大概輪廓提取出來

3、提取最接近目标區域的輪廓

常用函數有boundary,gen_contour_region_xld

4、根據自己的需求提取需要的初步輪廓

5、将初步提取的初步輪廓進行膨脹操作

6、将膨脹後的區域和原圖進行減操作(在這步之前有可能需要對原圖進行高斯濾波)。這樣就能得到隻有邊緣的真實圖像

7、用canny或其他算子(根據需要)提取亞像素輪廓,一般使用edges_sub_pix函數

8、處理和計算,得到真實的邊緣XLD後你可能需要進一步處理得到你想要的線、弧等。

你可能用到的函數segment_contours_xld(分割)  union_collinear_contours_xld(聯合相鄰或相同角度直線)select_contours_xld(提取想要的輪廓) union_cocircular_contours_xld(聯合相同圓)等等

得到輪廓後如果你不知道怎麼處理後得到你想要的東西(線、弧、圓、角、矩形)你都可以将輪廓轉化為點,然後用點集合來拟合任何你想要的東西。

四、常用的選擇和修改區域的算子

select_shape:選擇區域

shape_trans:區域變換

union1、union2、intersection、difference、complement、clip_region:常用的組合區域的算子

一些組合區域的操作圖解:

Halcon找圓系列(1)如何檢測圓形

一些變換區域的操作圖解:

Halcon找圓系列(1)如何檢測圓形

---

參考資料

鳥叔封裝的halcon rake卡直線 spoke卡圓工具(開源版) v1.3 20190527

https://www.51halcon.com/forum.php?mod=viewthread&tid=228

封裝的halcon找頂點的函數-peak

https://www.51halcon.com/forum.php?mod=viewthread&tid=731

Halcon測量圓直徑(半徑)的方法之暴力拟合法 vs 測量工具法

https://blog.csdn.net/horsee/article/details/82794569

halcon邊緣提取和贓物檢測的常用方法

https://blog.csdn.net/dearpeer/article/details/40855233

Halcon - 基礎03 - 常用的選擇和修改區域的算子

https://blog.csdn.net/zdfffg/article/details/83055265

繼續閱讀