文章目录
*这个示例程序展示了如何使用局部可变形匹配来查找变形的对象。在这个例子中,物体的变形是由模拟的棉塞印刷效果产生的。
*准备MVTec徽标的局部可变形模型。
dev_update_off ()
Width := 256
Height := 256
create_mvtec_logo_broadened (LogoImage, 0, 200, Width, Height)
decompose3 (LogoImage, ImageR, ImageG, ImageB)
WindowWidth := 2 * Width
WindowHeight := 2 * Height
Smoothness := 21
dev_close_window ()
dev_open_window (0, 0, WindowWidth, WindowHeight, 'black', WindowHandle1)
dev_display (LogoImage)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
disp_message (WindowHandle1, 'Model image', 'window', 12, 12, 'black', 'true')
rgb1_to_gray (LogoImage, GrayImage)
gen_rectangle1 (Rectangle, 82, 17, 177, 235)
reduce_domain (GrayImage, Rectangle, ImageReduced)
**提取矩形模板域,稍后将与搜索图像的校正版本进行比较。
crop_domain (ImageReduced, ImagePart)
*使用use_polarity作为度量创建局部可变形模型。
create_local_deformable_model (ImageReduced, 'auto', [], [], 'auto', 1, [], 'auto', 1, [], 'auto', 'none', 'use_polarity', 'auto', 'auto', [], [], ModelID)
get_deformable_model_contours (ModelContours, ModelID, 1)
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
*打开一个窗口,用于将校正后的匹配与裁剪后的模型图像进行比较。
get_image_size (ImagePart, WidthPart, HeightPart)
WindowWidthPart := 2 * WidthPart
WindowHeightPart := 2 * HeightPart
dev_open_window (0, WindowWidth + 8, WindowWidthPart * 1.5, WindowHeightPart * 1.5, 'black', WindowHandle2)
set_display_font (WindowHandle2, 16, 'mono', 'true', 'false')
*出于演示的目的,匹配被应用于搜索显示具有增加的人工变形量的标志的图像。
gen_random_vector_field (VectorFieldFrom, Width, Height, 0, 2)
vector_field_to_real (VectorFieldFrom, VFFromRow, VFFromCol)
for Index := 1 to 5 by 1
gen_random_vector_field (VectorFieldTo, Width, Height, 40, 2)
vector_field_to_real (VectorFieldTo, VFToRow, VFToCol)
for T := 0.0 to 0.95 by 0.05
*使用人工变形创建搜索图像。
create_deformed_mvtec_logo (VFFromRow, VFFromCol, VFToRow, VFToCol, ImageR, ImageG, ImageB, SearchImage, T)
rgb1_to_gray (SearchImage, GrayImage)
*在变形的搜索图像中找到模型。因此,应该返回校正后的图像、相应的矢量场以及找到的模型实例的变形轮廓。
count_seconds (Seconds1)
find_local_deformable_model (GrayImage, ImageRectified, VectorField, DeformedContours, ModelID, 0, 0, 1, 1, 1, 1, 0.5, 1, 1, 4, 0.9, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [Smoothness,0,1], Score, Row, Column)
count_seconds (Seconds2)
Time := 1000.0 * (Seconds2 - Seconds1)
dev_set_window (WindowHandle1)
*对于可视化,我们使用返回的矢量场,并在搜索图像中生成变形网格。
gen_warped_mesh (VectorField, WarpedMesh, 10)
dev_display (SearchImage)
dev_set_color ('yellow')
dev_set_line_width (1)
dev_display (WarpedMesh)
dev_set_line_width (3)
dev_set_color ('green')
dev_display (DeformedContours)
disp_message (WindowHandle1, 'Match found in ' + Time$'3.1f' + ' ms (Score: ' + Score$'3.2f' + ')', 'window', 12, 12, 'black', 'true')
dev_set_window (WindowHandle2)
*为了可视化校正的搜索图像和原始模型区域之间的差异,使用绝对差异。
abs_diff_image (ImagePart, ImageRectified, ImageAbsDiff1, 1)
dev_display (ImageAbsDiff1)
disp_message (WindowHandle2, 'Difference between model image and rectified image', 'window', 12, 12, 'black', 'true')
*可选地,可以通过使用光流来进一步减小经矫正的搜索图像和原始模型区域之间的差异(取消对以下行的注释)。
* optical_flow_mg (ImagePart, ImageRectified, VectorField1, 'clg', 0.8, 1, 20, 5, 'default_parameters', 'very_accurate')
* unwarp_image_vector_field (ImageRectified, VectorField1, ImageUnwarped)
* vector_field_to_real (VectorField1, RowField, ColField)
* vector_field_length (VectorField1, Length, 'length')
* abs_diff_image (ImagePart, ImageUnwarped, ImageAbsDiff, 1)
* stop ()
endfor
copy_obj (VFToRow, VFFromRow, 1, 1)
copy_obj (VFToCol, VFFromCol, 1, 1)
endfor