基于Halcon的高精度圆拟合算法思路
最近研究halcon的圓孔定位四個月了,這里分享一下我的心得,也是備忘
項目描述
Halcon圓檢測相關方法
| 區域分割 | 直接用對比度分割出關鍵的圓形 | 當圓環和周圍顏色相近時,直接罷工 | segment_image_mser |
| 邊緣分析 | 提取圖像中的關鍵邊緣,找到可能是圓弧的部分,拼接成一條完整圓弧,然后擬合 | 平滑后的精度低,不平滑圖像中有很多零散圓弧干擾 | edges_sub_pix |
| 霍夫變換 | 通過沿著區域點畫圓,找到大概率是圓心的區域 | 當參數半徑和實際偏差較大時,得到的區域不準確 | hough_circle_trans |
| 二維邊緣測量 | 在圓周一圈找閾值峰值點,用這些點進行擬合 | 有圖像可能存在非常多的干擾峰值 | add_metrology_object_circle_measure |
| NCC模板匹配 | 基于模板和圖像的偏差 | 當圖像圓中有復雜圖像時,無法找到結果 | find_ncc_models |
| 形狀模板匹配 | 基于模板的邊緣對比度 | 較差的圖像需要調低得分,但低得分容易帶來錯誤結果 | find_shape_models |
| 梯度圖關鍵點擬合 | 先找到梯度圖中可能是圓弧的點,再用這些點進行擬合 | 找的點不準確容易有偏差 | edges_image, fit_circle_contour_xld |
算法步驟
通常,我們進行兩次定位
算法描述
因為遇到了很多糟心的圖片,所以樓主的算法也相應比較復雜
下面是簡單的描述:
- 粗定位 :
1. create_shape_model 共需兩個模板,金字塔層數設為2(1太耗時,3以上有可能找不到目標圓),一個ignore_global_polarity,一個ignore_local_polarity,最好保存模板,因為生成模板是很耗時的操作
2. 第一次 find_shape_models 找ignore_global_polarity的模板,分數0.8,個數5,不允許重疊
3. 第二次 find_shape_models(第一次沒找到才需要) 找ignore_local_polarity的模板,分數0.8,個數5,不允許重疊
4. 第三次 find_shape_models 平滑圖像(第二次沒找到才需要),找ignore_global_polarity的模板,分數0.8,個數5,不允許重疊
注意:三次有任何一次有結果就可以直接作為粗定位結果,接下來對找到的結果逐個分析 - 精定位 :
-
預處理:
reduce_domain 縮小范圍
edges_image 獲取梯度圖,方向圖 -
獲取梯度方向偏差圖片:
因為圓環的梯度方向都是統一的,類似如下的圖片(有可能需要旋轉),我們可以用得到的梯度方向圖減去下圖,就可以得到梯度方向偏差圖,其中灰度接近0的點就是我們所需要的關鍵點 -
對梯度方向偏差圖做極大值抑制,得到Image_Result
nonmax_suppression_dir 這樣可以獲得最可能是圓周的邊緣點集 -
找條帶邊緣
find_shape_models 找梯度方向偏差圖的邊緣,極性ignore_global_polarity,分數0.8,只找最高分的結果,這個結果就是我們所需的邊緣 -
對條帶邊緣做精擬合
因為shape_model得到的結果不穩定,在邊緣有毛刺時容易有細微的偏差,所以我在這個結果周圍找到Image_Result中的關鍵點進性擬合 -
找邊緣結果
find_shape_models 找原圖的reduce_domain圖的邊緣,極性ignore_global_polarity,分數0.8,只找最高分的結果,這個結果就是我們所需的邊緣
注意:如果粗定位使用了平滑,那這里也需要平滑,因為圖像可能存在很多噪點、條紋的干擾 -
對原始邊緣做精擬合
因為shape_model得到的結果不穩定,容易有細微的偏差,所以我在這個結果周圍找到Image_Result中的關鍵點進性擬合 -
仍未找到目標圓的情況
如果還沒找到圓,有兩種可能,
1:圖像很差
2:客戶的直徑或極性輸錯了 -
權重定位法
因為客戶給出的直徑有可能是錯誤,所以這里我使用過程中得到的半徑作為目標分析,而不再使用客戶給出的直徑,這樣也可以提高對不良結果的過濾。
注意:精定位可以直接使用權重定位法,跳過上面的條帶結果和邊緣結果分析,但這樣遇到多層圓環時,容易帶來一半內環,一半外環的問題。 -
得到關鍵點
對Image_Result使用get_region_points,注意嚴格區分正負極性,分開分析 -
給關鍵點賦予權重
Weight = Amp (點的梯度) / Dist (點到圓心和理論直徑的偏差)
注意:權重還可以添加很多要素,比如圓周的灰度一致性,梯度方向一致性等,這里只是個例子 -
二值分割
過濾出最權重較為顯著的點,構成contour,過濾掉circularity較低的結果 -
擬合成圓
fit_circle_contour_xld
總結
以上是生活随笔為你收集整理的基于Halcon的高精度圆拟合算法思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: F - Tian Ji -- The H
- 下一篇: 一点体会