*难点
*find_local_deformable_model变形模板匹配匹配时间长,参数不同会导致结果差别很大
*解决方法
*时间长问题
*1,可以从降低图像分辨率zoom_image_factor,
*2,先用形状匹配,阈值分割或者提边进行粗略定位,缩小匹配范围(reduce_domain)再进行精确变形匹配
*3,算出模板大小与实际物体的小确定变形值再进行变形匹配可大大缩短时间
*4,在都能匹配与精度都符合要求的条件下,选择最小的金字塔进行匹配
*参数
*对变形影响较大的就是可变形平滑系数,一般来说30以上匹配效果较好
**读轮廓
dev_set_line_width (3)
dev_update_off ()
* read_contour_xld_dxf (Contours1, 'C:/Users/Administrator/Desktop/11.dxf',[], [], DxfStatus1)
read_contour_xld_dxf (Contours1, '模板/11.dxf',[], [], DxfStatus1)
select_contours_xld (Contours1, originalContours, 'contour_length', 300, 20000, -0.5, 0.5)
count_obj (originalContours, Number2)
if (Number2!=1)
select_contours_xld (Contours1, originalContours, 'contour_length', 500, 20000, -0.5, 0.5)
endif
smallest_rectangle2_xld (originalContours, Row1, Column1, Phi1, r_Length12, c_Length22)
*镜像
hom_mat2d_identity (HomMat2DIdentity1)
hom_mat2d_slant (HomMat2DIdentity1, rad(180), 'x', 0, 0, HomMat2DIdentity1)
affine_trans_contour_xld (originalContours, mirrorContours, HomMat2DIdentity1)
affine_trans_contour_xld (Contours1, mirrorContours111, HomMat2DIdentity1)
**读图
* read_image (Image3, 'D:/智远/画线机匹配/智远画线机/8.12变形模板匹配/model/Model.bmp')
read_image (Image3, '模板/1.bmp')
get_image_size (Image3, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width/6, Height/6, 'black', WindowHandle)
dev_display (Image3)
rgb1_to_gray (Image3, GrayImage)
count_seconds (Seconds2)
* decompose3 (Image3, R, G, B)
* trans_from_rgb (R, G, B, S, H, V, 'hsv')
**初始化参数值
*红色通道
* GrayImage:=V
**可变形模板最小对比度
m_MinContrast:=35
**可变形平滑系数------大于30以上效果较好
Smoothness:=35
**可变形匹配得分
m_Score2:=0.8
* gray_opening_rect (GrayImage, GrayImage, 10.5, 10.5)
* gray_closing_rect (GrayImage, GrayImage, 10.5, 10.5)
median_rect (GrayImage, GrayImage, 18, 18)
zoom_image_factor (GrayImage, GrayImage, 0.25, 0.25, 'constant')
edges_sub_pix (GrayImage, Edges, 'canny', 3, 20, 40)
union_adjacent_contours_xld (Edges, Edges, 20, 1, 'attr_forget')
select_shape_xld (Edges, SelectedXLD, 'contlength', 'and', 800, 2000)
* threshold (GrayImage, Region, 0, 120)
* connection (Region, ConnectedRegions)
* select_shape (ConnectedRegions, ConnectedRegions, 'area', 'and', 200, 99999)
*计算图像缩放比例
* gen_contour_region_xld (ConnectedRegions, Contours, 'border')
* smallest_rectangle2_xld (Contours, Row1, Column1, Phi1, Length11, Length21)
* gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi1, Length11, Length21)
*dilation_circle (ConnectedRegions, RegionDilation, 10.5)
count_obj (SelectedXLD, Number2)
**创建可变形模板,'auto'
create_local_deformable_model_xld (originalContours, 6, 0, rad(360), 'auto', 1, 5, 'auto', 1, 5, \
'auto', 'auto', 'ignore_local_polarity', m_MinContrast, \
[], [], ModelID3)
get_deformable_model_contours (ModelContours2, ModelID3, 1)
* inspect_shape_model (GrayImage, ModelImages, ModelRegions, 4, 30)
*变换轮廓用
create_local_deformable_model_xld (Contours1, 5, 0, rad(360), 'auto', 1, 5, 'auto', 1, 5, \
'auto', 'none', 'ignore_local_polarity', 10, \
'part_size', 'big', ModelID1)
*计时开始c
count_seconds (Seconds2)
get_deformable_model_contours (ModelContours, ModelID1, 1)
smallest_rectangle1_xld (ModelContours, Row11, Column11, Row2, Column2)
vector_angle_to_rigid (0, 0,0, -min(Row11)+0.5, -min(Column11)+0.5, 0, HomMat2D3)
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D3)
gen_empty_obj (Object)
gen_empty_obj (Object1)
hom_mat2d_identity (HomMat2D)
for Index1 := 0 to Number2-1 by 1
select_obj (SelectedXLD, ObjectSelected, Index1+1)
smallest_rectangle2_xld (ObjectSelected, Row, Column, Phi, Length1, Length2)
gen_region_contour_xld (ObjectSelected, ObjectSelected, 'filled')
shape_trans (ObjectSelected, ObjectSelected, 'convex')
dilation_rectangle1 (ObjectSelected, RegionDilation, 10.5, 10.5)
reduce_domain (GrayImage, RegionDilation, ImageReduced)
scale_r:=Length1/r_Length12
scale_c:=Length2/c_Length22
find_local_deformable_model (ImageReduced, ImageRectified, VectorField, DContours3, ModelID3, -rad(180), \
rad(360), scale_r, scale_r, scale_c, scale_c, 0.5, 1, 0.9, \
5, 0.9, ['image_rectified', 'vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'],[Smoothness,0,0],\
Score2, Row4, Column4)
* get_deformable_model_contours (ModelContours1, ModelID3, 1)
* get_image_size (ImageRectified, Width1, Height1)
**轮廓变换**
* gen_empty_obj (WarpedMesh)
* count_obj (VectorField, Number)
* for Index := 1 to Number by 1
* gen_empty_obj (EmptyObject)
* select_obj (VectorField, ObjectSelected1, Index)
* vector_field_to_real (ObjectSelected1, DRow, DColumn)
* count_obj (ContoursAffineTrans, Number1)
* for j := 1 to Number1 by 1
* select_obj (ContoursAffineTrans, ObjectSelected, j)
* smallest_rectangle1_xld (ObjectSelected, Row12, Column12, Row21, Column21)
* if ((Width1<Column21)or(Height1<Row21))
* continue
* endif
* get_grayval_contour_xld (DRow, ObjectSelected, 'bilinear', R_Grayva)
* get_grayval_contour_xld (DColumn, ObjectSelected, 'bilinear', C_Grayva)
* gen_contour_polygon_xld (Contour_1, R_Grayva, C_Grayva)
* concat_obj (Object, Contour_1, Object)
* endfor
* endfor
*concat_obj (Object1, DContours3, Object1)
concat_obj (Object1, DContours3, Object1)
endfor
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_scale (HomMat2DIdentity, 4, 4, 0, 0, HomMat2DScale)
affine_trans_contour_xld (Object1, Object1, HomMat2DScale)
affine_trans_contour_xld (Object, Object, HomMat2DScale)
dev_set_color ('green')
count_seconds (Seconds3)
times:=Seconds3-Seconds2
dev_display (Image3)
dev_display (Object)
dev_set_color ('red')
dev_display (Object1)
dev_get_window (WindowHandle1)
disp_message (WindowHandle1, 'times:'+times+' s', 'image', 400, 2400, 'black', 'true')
stop ()
匹配效果
形状匹配
变形匹配