Halcon 實戰:如何為 XLD 模板添加極性信息以提升匹配精度?
在使用 Halcon 進行模板匹配時,我們通常有兩種方式創建模板:
- 基于圖像灰度(
CreateScaledShapeModel
) - 基于輪廓 XLD(
CreateScaledShapeModelXld
)
前者可自動提取邊緣極性信息(即邊緣是“由暗到亮”還是“由亮到暗”),而后者則因輪廓缺乏原始圖像灰度數據,默認不含極性信息。
然而,在實際應用中,我們常常基于手動繪制或處理后的輪廓 XLD
創建模板,此時如果繼續忽略極性,會在復雜背景下降低匹配精度,甚至出現誤匹配。
本文將介紹一種 先創建無極性的輪廓模型,再通過實際圖像自動注入極性信息 的技巧。
1?? 問題背景:XLD 模板不支持 use_polarity?
我們在使用如下方式創建模板時,若將 polarity
設置為 "use_polarity"
,就會報錯:
HOperatorSet.CreateScaledShapeModelXld(contours,"auto",angleStartRad,angleRangeRad,angleStepRad,minScale,maxScale,"auto","auto","use_polarity", // ? 報錯contrast,out modelID);
這是因為 XLD
輪廓本身不攜帶灰度信息,Halcon 無法判斷邊緣方向(極性),從而無法創建包含極性的模型。
2?? 正確方式:先使用 ignore_local_polarity 創建
正確做法是先忽略極性創建模型:
HOperatorSet.CreateScaledShapeModelXld(contours,"auto",angleStartRad,angleRangeRad,angleStepRad,minScale,maxScale,"auto","auto","ignore_local_polarity", // ? 安全模式contrast,out modelID);
此時創建的模板沒有極性,但可以匹配。
3?? 高級技巧:后處理注入極性信息
Halcon 提供了一個鮮為人知的運算符 set_shape_model_metric
,允許我們在首次匹配后,使用真實圖像為模板注入極性信息。
? 完整流程如下:
① 匹配一次獲取模板位姿
HOperatorSet.FindScaledShapeModel(image,modelID,angleStart, angleRange,minScale, maxScale,0.8, 1, 0.5,"least_squares", 0, 0.9,out rowMatch, out colMatch,out angleMatch, out scaleMatch, out score);
② 創建仿射變換矩陣
HOperatorSet.VectorAngleToRigid(0, 0, 0, // 模板參考點是 (0,0)rowMatch[0], colMatch[0], angleMatch[0],out homMat2D);
③ 為模型設置極性
HOperatorSet.SetShapeModelMetric(image,modelID,homMat2D,"use_polarity"); // 🎯 注入極性信息
此操作將遍歷模板輪廓,并結合實際圖像的灰度變化自動設置每條邊的極性。
4?? 后續使用:可正常使用 use_polarity 匹配
一旦極性信息注入完成,后續匹配時可以正常使用極性,從而獲得更高的準確率和抗干擾能力。
HOperatorSet.FindScaledShapeModel(image,modelID,angleStart, angleRange,minScale, maxScale,0.8, 1, 0.5,"least_squares", 0, 0.9,out rowMatch, out colMatch,out angleMatch, out scaleMatch, out score);
Halcon 會自動使用之前注入的極性信息進行匹配。
🧠 總結
步驟 | 操作 | 說明 |
---|---|---|
① | CreateScaledShapeModelXld(..., "ignore_local_polarity") | 創建無極性模型 |
② | FindScaledShapeModel(...) | 匹配一次獲得位置 |
③ | VectorAngleToRigid(...) | 得到模板 → 匹配點的變換 |
④ | SetShapeModelMetric(..., "use_polarity") | 注入極性信息 |
這種方式彌補了 XLD
模板模型初始不支持極性的缺陷。
效果展示
沒加極性的匹配效果:
加了極性的匹配效果:
可以看到加了極性之后,匹配精確度更好了。