基于halcon的变形模板匹配

*难点
*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 ()

匹配效果

形状匹配

 变形匹配

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值