该例程是基于形状的模板匹配(多对多),适用于形状特征比较明显,且有多个模板、需识别出多个轮廓的情况。
*模板匹配基于形状多对多 2020/3/23
*更新
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
dev_close_window ()
*设置轮廓样式,线宽
read_image (Image1, 'C:/1.png')
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 24, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (5)
*创建空模板(存放多个模板区域信息)
gen_empty_obj (Models)
IndexS:=[]
IndexE:=[]
ModelIDs:=[]
stop()
*开始创建模型
list_files ('C:/多对多匹配模板图片', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image1, ImageFiles[Index])
rgb3_to_gray (Image1, Image1, Image1, Image)
disp_message (WindowHandle, '开始抠图', 'window', 12, 12, 'pink', 'false')
if(Index = 0)
*用于图1
gen_circle (ROI_0, 254.627, 181.205, 92.4421)
else
*用于图2
gen_rectangle2 (ROI_0, 245.064, 208.249, rad(-10.3378), 69.3968, 60.4693)
endif
reduce_domain (Image, ROI_0, ImageReduced)
create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 5, 30)
get_shape_model_contours (ModelContours, ModelID, 1)
count_obj (ModelContours, NumModel)
count_obj (Models, NumModels)
concat_obj (Models, ModelContours, Models)
IndexS := [IndexS,NumModels + 1]
IndexE := [IndexE,NumModels + NumModel]
ModelIDs := [ModelIDs,ModelID]
endfor
stop()
*开始识别
read_image (Image3, 'C:/1.png')
rgb3_to_gray (Image3, Image3, Image3, ImageGray)
scale_image (ImageGray, ImageScaled, 1.90299, -84)
dev_open_window_fit_image (ImageScaled, 0, 0, -1, -1, WindowHandle1)
dev_display (ImageScaled)
count_seconds (t1)
find_shape_models (ImageScaled, ModelIDs, rad(0),rad(360), 0.4, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score, Model)
count_seconds (t2)
Time := (t2 - t1) * 1000
*显示
if(|Score|>0)
Num := |Score|
for J := 0 to Num - 1 by 1
copy_obj (Models, ModelSelected, IndexS[Model[J]], IndexE[Model[J]] - IndexS[Model[J]] + 1)
vector_angle_to_rigid (0, 0, 0, Row[J], Column[J], Angle[J], HomMat2D)
affine_trans_contour_xld (ModelSelected, ModelTrans, HomMat2D)
dev_display (ImageScaled)
if(Model[J]==0)
dev_set_color ('red')
elseif(Model[J]==1)
dev_set_color ('green')
endif
dev_display (ModelTrans)
endfor
endif
*显示文字
set_display_font (WindowHandle1, 24, 'mono', 'true', 'false')
dev_set_color ('yellow')
set_tposition (WindowHandle1, 20, 20)
if (Num == 1)
write_string (WindowHandle1, Num$'1d' + ' object found in ' + Time$'4.2f' + 'ms')
else
write_string (WindowHandle1, Num$'1d' + ' objects found in ' + Time$'4.2f' + 'ms')
endif
识别结果
模板图片(该例程的模板图片和测试图片都是从超人视觉初级班课程里截图的)
测试图片