*这个示例程序演示了如何使用基于形状的匹配以查找稍微变形的对象,使用参数“最大变形”;
*请注意,要查找变形对象,可以使用参数应用基于形状的匹配“最大变形”或-应用局部可变形匹配;
*在本例中,任务是使用基于形状的匹配和参数“最大变形”。你可以将其与示例进行比较“查找可变形的可可包”,哪个使用局部变形匹配解决相同的任务。基于形状的匹配速度明显更快,但局部可变形匹配对不同类型的图像具有更强的鲁棒性
dev_update_off ()
*读取图像
read_image (ModelImage, 'food/cocoa_package_model')
*关闭窗口
dev_close_window ()
*打开窗口自适应图像
dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
*设置显示字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*创建并显示形状模型
create_shape_model (ModelImage, 'auto', rad(-20), rad(40), 'auto', 'auto', 'use_polarity', [40,60,'auto_min_size'], 10, ModelID)
*得到模板的轮廓
*注:模板的位置会回到原点
get_shape_model_contours (ModelContours, ModelID, 1)
*得到区域的行列坐标
area_center (ModelImage, Area, Row, Column)
*仿射变换
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DTranslate)
*设置一系列参数
dev_set_line_width (2)
dev_set_color ('yellow')
dev_display (ModelImage)
dev_display (ContoursAffineTrans)
disp_message (WindowHandle, 'Model image and contours', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*图片有13张
NumImages := 13
*开始进行for循环
for Index := 1 to NumImages by 1
*读取图片
read_image (Image, 'food/cocoa_packages_' + Index$'02')
*降低图像分辨率以提高速度
dev_resize_window_fit_image (Image, 0, 0, -1, -1)
*显示图片
dev_display (Image)
disp_message (WindowHandle, 'Search...', 'window', 12, 12, 'black', 'true')
*寻找模板前的时间
count_seconds (S1)
*在搜索图像中找到变形模型
*并显示结果
*开始寻找模板
find_shape_model (Image, ModelID, rad(-20), rad(40), 0.6, 0, 0.5, ['least_squares','max_deformation 16'], 0, 0.4, Row, Column, Angle, Score)
*寻找模板后的时间
count_seconds (S2)
Time := (S2 - S1) * 1000
*设置颜色
dev_set_color ('green')
*显示匹配后的结果
dev_display_shape_matching_results (ModelID, 'green', Row, Column, Angle, 1, 1, ModelID)
disp_message (WindowHandle, |Score| + ' matches found in ' + Time$'3.1f' + ' ms', 'window', 12, 12, 'black', 'true')
*在图片下方显示结果
disp_message (WindowHandle, 'Score: ' + Score$'.2f', 'image', 350, Column - 80, 'black', 'true')
*如果索引小于图片的张数,则继续
if (Index < NumImages)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
endfor
clear_shape_model (ModelID)
*开始寻找模板
find_shape_model (Image, ModelID, rad(-20), rad(40), 0.6, 0, 0.5, ['least_squares','max_deformation 16'], 0, 0.4, Row, Column, Angle, Score)
1、在一些应用中,精度要求非常高。在这些情况下,可以通过最小二乘法调整来确定模型的姿态。与“interpolation”相反,该模式需要额外的计算时间。可以使用不同的最小二乘法调整模式('least_squares','least_squares_high'和'least_squares_very_high')来确定正在搜索最小距离的准确性。然而,选择精度越高,子像素提取将采取越长的时间。通常,SubPixel应设置为“interpolation”。如果需要进行最小二乘法调整,则应选“least_squares”,因为这将导致运行时和精度之间的最佳权衡。
2、相对于模型而言有稍微变形的物体,在某些情况下,无法被找到或者即使被找到,精度也很低。对于这样的对象,可以在参数SubPixel中额外传递最大允许对象变形。变形必须以像素为单位指定。这可以通过传递可选参数值“max_deformation”,后跟一个0到32之间的整数值(在同一个字符串中),该值指定最大变形。例如,如果对象的形状相对于存储在模型中的形状可以变形多达2个像素,则必须在SubPixel中传递值“max_deformation 2”。传递值“max_deformation 0”时,进行搜索时要求物体不能变形,与不设定“max_deformation”的作用一样。
3、请注意,最大变形值设定得较高时通常会导致运行时间增加。此外,选择变形值越高,发现错误模型实例的风险越高。这两个问题主要出现在搜索小物体或具有精细结构的物体时。这是因为这种物体在高变形时会失去其特征形状,而特征形状对于强大的搜索来说是很重要的。还要注意,对于较高的变形,如果在物体附近存在杂波,部分遮挡物体的精度可能会降低。因此,最大变形应尽可能选择尽可能小,只有在有必要的时候才设置得高一点。