基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要达到的要求或者我们所需要检测的目标存在多个特征需要去判别,所以这个时候可以考虑多模板匹配,以增加特征的个数来提高精度或者去得到所需要查找的多个不同特征目标。
直接上原图,供创建模板的图片:
代码如下:
read_image (Image, 'C:/Users/Administrator/Desktop/mixed_01.png')
dev_set_draw ('margin')
*创建圆形模板
gen_circle (Circle, 81, 155, 65)
reduce_domain (Image, Circle, ImageCircle)
create_scaled_shape_model (ImageCircle, 'auto', -0.39, 0.79, 'auto', 0.6, 1.5, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID1)
*创建6边形模板
gen_rectangle1 (Rectangle, 127, 336, 211, 438)
reduce_domain (Image, Rectangle, ImageRectangle)
create_scaled_shape_model (ImageRectangle, 'auto', -0.39, 0.79, 'auto', 0.6, 1.5, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID2)
*创建8角齿轮模板
gen_rectangle1 (Rectangle1, 213, 362, 297, 454)
reduce_domain (Image, Rectangle1, ImageRectangle1)
create_scaled_shape_model (ImageRectangle1, 'auto', -0.39, 0.79, 'auto', 0.6, 1.5, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID3)
*弄一个模板数组,将之前的三个模板放进数组中
ModelIDs:=[ModelID1,ModelID2,ModelID3]
*查看模板轮廓
get_shape_model_contours (ModelContours1, ModelID1, 1)
get_shape_model_contours (ModelContours2, ModelID2, 1)
get_shape_model_contours (ModelContours3, ModelID3, 1)
stop()
*得到模板图片区域的中心点
* fast_threshold (ImageCircle, Region1, 0, 50, 20)
* area_center (Region1, Area1, Row1, Column1)
* fast_threshold (ImageRectangle, Region2, 0, 50, 20)
* area_center (Region2, Area2, Row2, Column2)
* fast_threshold (ImageRectangle1, Region3, 0, 50, 20)
* area_center (Region3, Area3, Row3, Column3)
*设置线宽
dev_set_line_width (4)
*生成一个空集对象
gen_empty_obj (EmptyObject)
*查找模板
find_scaled_shape_models (Image, ModelIDs, -0.39, 0.78, 0.6, 1.6, 0.7, 0, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score, Model)
for i := 0 to |Model|-1 by 1
*get_shape_model_contours
*这个算子只能得到旋转平移矩阵,要得到缩放比例的话需要在此矩阵基础上在计算缩放
vector_angle_to_rigid (0, 0, 0, Row[i], Column[i], Angle[i], HomMat2D)
*这一步就是计算带有缩放比例的矩阵
hom_mat2d_scale (HomMat2D, Scale[i], Scale[i], Row[i], Column[i], HomMat2DScale)
if(Model[i] == 0)
affine_trans_contour_xld (ModelContours1, ContoursAffinTrans, HomMat2DScale)
*将仿射变换后的轮廓添加进之前建立的空集对象数组中
concat_obj (EmptyObject, ContoursAffinTrans, EmptyObject)
endif
if(Model[i] == 1)
affine_trans_contour_xld (ModelContours2, ContoursAffinTrans, HomMat2DScale)
concat_obj (EmptyObject, ContoursAffinTrans, EmptyObject)
endif
if(Model[i] == 2)
affine_trans_contour_xld (ModelContours3, ContoursAffinTrans, HomMat2DScale)
concat_obj (EmptyObject, ContoursAffinTrans, EmptyObject)
endif
dev_display (Image)
dev_display (ContoursAffinTrans)
stop()
endfor
dev_display (Image)
dev_display (EmptyObject)
clear_shape_model (ModelID1)
clear_shape_model (ModelID2)
clear_shape_model (ModelID3)
最后的效果图如下:
可以直接从最后的效果图中看到我们已经把目标和找到的模板轮廓一一对应起来了,还有个齿轮状的目标没有标记,是因为这个齿轮和我们的目标8角齿轮并不是同一个,所以没找到是正确的,但是在find_scaled_shape_models的时候需要注意,对于这种很类似于我们目标的物体我们需要通过设置模板匹配Score来限制他被误查找。
在我们这个的案例中介绍了多模板匹配的同时也演示了如何去查找缩放的模板。