我這人比較懶得羅里吧嗦,基本都是直接說兩點:why?how?有需求,才會去做。有時候,在一張質量不怎麼好的影象上做模板,比如,有很多干擾點、背景或者其他不想要的輪廓,除了生成模板後,再慢慢去用橡皮擦來擦除它,還有一種更直接了當的方法:篩選。
bool
gendesiredcontours
(const hxld& srccontours, hxld& dstcontours,
qpoint length, qpointf circularity,
int delta =0,
int contournum =0)
;
引數1 :srccontours,輸入的原始輪廓,一般先生成模板,然後get~
引數2 :dstcontours,輸出篩選後的輪廓,用來重新生成模板;
引數3 :length,為篩選輪廓的最小長度值;
引數4 :circularity,為篩選輪廓的圓度值;
引數5 :delta,為依靠相鄰輪廓的偏差值來判斷,後續的輪廓還要不要了;
引數6 :contournum,直接粗暴,指明就要最長的幾個輪廓。
bool halconunity::
gendesiredcontours
(const hxld& srccontours, hxld& dstcontours,
qpoint length, qpointf circularity,
int delta,
int contournum)
lengthxld
(selectobj,
&xldlength)
; xldlengthmap.
insert
(i,(
int)xldlength[0]
.d()
);xldlengthlist.((
int)xldlength[0]
.d()
);}qsort
(xldlengthlist)
;int judgemaxxld = xldlengthlist.
length()
;if(judgemaxxld >2)
}//else if (percent > 0)
//// else
//
//}//差值判斷
if(delta >
0.0)}}
//標準差
//// mean = sum / judgemaxxld;
// for (i = 0; i < judgemaxxld; ++i)
//
// stddeviation = sqrt(variance / judgemaxxld);
// for (i = judgemaxxld - 1; i >= 0; i--)
//
// }
//}}
int count =0;
for(
int i = xldlengthlist.
length()
-1; i >=
0; i--
)else
count++;if
(count >= judgemaxxld)
iter = xldlengthmap.
erase
(iter);}
else}}
}catch
(hexception& ex)
catch(.
..)return
false
;}
篩選出來的輪廓,可以直接用createscaledshapemodelxld建立模板,但這個比較麻煩:如果輪廓線還是比較多、比較複雜的話,很耗時。所以我一般是再把輪廓轉為區域,然後再用區域去建立模板。
注意二次建立模板後,不要直接用新的輪廓或者區域的中心點去仿射變換,應該還是用原來第一次建立模板的區域去做變換,不然你的模板輪廓會錯位顯示,很尷尬。
Halcon基於輪廓的模板匹配
大家自己找張測試,就是繪製搜尋區域跟模板提取,提取其輪廓,然後再找一張相似的,從中定位到模板。話不多說,直接上 read image image1,d users s200722103 桌面 r1 f8y046205u1n639a1 038 20201109103715200.jpg dev set...
halcon基於形狀的幾何定位函式說明
1.create shape model template reduce domain後的模板影象 numlevels,金字塔的層數,可設為 auto 或0 10的整數 anglestart,模板旋轉的起始角度 angleextent,模板旋轉角度範圍,0 anglestep,旋轉角度的步長,0 a...
9 halcon定位學習(1) 基於形狀的匹配
1 基於形狀的匹配 1 建立roi 使用halcon 運算元可以方便的設定roi 標準形狀 draw rectangle1 2 draw circle draw ellipse draw line 任意形狀 draw region draw polygon 生成標準roi gen rectangle...