我一直在 HALCON 中使用 NCC 模板匹配,并且面临着在搜索图像中准确定位我的模板的挑战。尽管尝试了各种预处理技术并利用感兴趣区域 (ROI),但我始终遇到精度问题,有时无法完全检测模板。我在下面附上了模板和搜索图像的图像。
模板图片:
gen_rectangle1 (ROI, 651.344, 888.522, 730.939, 931.704)
reduce_domain(image, ROI, templimage)
impath := '/path/to/search_image.bmp'
read_image(image, impath)
rgb1_to_gray(image, image)
gen_rectangle1 (ROI, 545.35, 739.29, 612.312, 776.902)
reduce_domain(image, ROI, templimage)
* create model
create_ncc_model (templimage, 'auto', rad(0), rad(359), 'auto', 'use_polarity', NCCModelID)
* find model
find_ncc_model(image, NCCModelID, rad(0), rad(359), 0.68, 0, 0.8, 'true', 0, Row, Column, Angle, Score)
dev_clear_window()
dev_display(image)
dev_display_ncc_matching_results(NCCModelID, 'red', Row, Column, Angle, 0)
有人可以建议一些策略来提高 NCC 模板匹配的准确性和可靠性吗? HALCON 中是否有特定的预处理方法或设置可以帮助一致地正确识别模板?
感谢您的任何见解或建议!
我认为基于形状的匹配会给你更好的结果,但如果你必须使用NCC,这是我到目前为止的结果:
dev_update_off ()
read_image (Image, 'C:/Users/Perkovic/Desktop/Jff7mFg2.png')
rgb1_to_gray (Image, Image)
L1 := 41
L2 := 25
gen_rectangle2 (ROI, 691.4061, 911.5726, rad(-88.09105), L1, L2)
reduce_domain(Image, ROI, templimage)
gen_rectangle2 (ROI_0, 718.03, 909.1579, rad(90), 13.33325, 21.16724)
gen_rectangle2 (TMP_Region, 680.0816, 909.1579, rad(90.66528), 29.40351, 13.56099)
union2 (ROI_0, TMP_Region, ROI_0)
** Reduce domain
threshold (Image, Region, 0, 80)
fill_up (Region, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 10e3)
dilation_circle (SelectedRegions, RegionDilation, 70.5)
union1 (RegionDilation, RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
* create model
create_ncc_model (templimage, 'auto', -0.39, 6.29, 'auto', 'use_polarity', NCCModelID)
* find model
dev_clear_window()
dev_display(Image)
while (true)
find_ncc_model(ImageReduced, NCCModelID, -0.39, 6.29, 0.6, 1, 0.6, 'true', 0, Row, Column, Angle, Score)
if (Score == [])
break
endif
dev_display_ncc_matching_results(NCCModelID, 'red', Row, Column, Angle, 0)
dev_disp_text (Score, 'image', Row, Column, 'black', [], [])
** Remove rectangle from reduced image
gen_rectangle2 (Rectangle, Row, Column, Angle, L2, L1)
get_domain (ImageReduced, Domain)
difference (Domain, Rectangle, RegionDifference)
reduce_domain (ImageReduced, RegionDifference, ImageReduced)
endwhile