Halcon+C#(模板匹配+找圆)Halcon部分

3 篇文章 0 订阅

1:Halcon导入工件模板图片

*读取图像
read_image (Image, 'D:/桌面文件/Halcon/Halcon模块/模板匹配/模板匹配3/1 (1).bmp')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)

2:检测导入的图像是否可以成为模板(检测一下是否合格)

*ROI选取区域模板(上部工件的圆形区域)
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage)
edges_sub_pix (GrayImage, Edges, 'canny', 1, 20, 60)
gen_region_contour_xld (Edges, Region, 'filled')
select_shape (Region, SelectedRegions1, 'area', 'and', 150, 1000)
count_obj (SelectedRegions1, Number1)
if (Number1==2)
     area_center (SelectedRegions1, Area1, Row3, Column3)
     distance_pp (Row3[0], Column3[0], Row3[1], Column3[1], Distance1)
     gen_region_line (RegionLines1, Row3[0], Column3[0], Row3[1], Column3[1])
     dev_display (Image)
     dev_display (SelectedRegions1)
     dev_display (RegionLines1)
     disp_message (WindowHandle, Distance, 'window', 96, 290, 'green', 'true')
endif

我选取的是工件上面两个圆孔的为位置,作为本次的检测对象

3:保存模板

*模板旋转的角度
create_scaled_shape_model (ImageReduced,5,rad(0),rad(360), 'auto', 0.7,1.0, 'auto', 'auto', 'ignore_local_polarity', 'auto', 'auto', ModelID)
get_shape_model_contours (ModelContours, ModelID, 1)
*得到模板的中心(即要匹配的轮廓的初始位置,不是(0,0)那个轮廓)
area_center (Image, Area, Row, Column)
*//将模板轮廓平移到中心///
*产生模板平移的仿射变换 将(0,0)点的轮廓变换回轮廓的初始位置
vector_angle_to_rigid (0,0,0, Row, Column,0, HomMat2D)
*将仿射变换应用于轮廓
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)

4:导入其他工件作为检测项与模板进行对比

*读取要匹配的图片
read_image (ImageSearch, 'D:/桌面文件/Halcon/Halcon模块/模板匹配/模板匹配3/1 (12).bmp')
*寻找匹配的模板
find_scaled_shape_model (ImageSearch, ModelID,rad(0),rad(360), 0.8, 1.2, 0.8,0, 0.5, 'least_squares', 5, 0.3, Row1, Column1, Angle, Scale, Score)
*逐个显示模型 
for I:= 0 to |Score|-1 by 1
    *建立平移数组
    hom_mat2d_identity (HomMat2DIdentity)
    *平移
    hom_mat2d_translate (HomMat2DIdentity, Row1[I], Column1[I], HomMat2DTranslate)
    *旋转
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row1[I], Column1[I], HomMat2DRotate)
    *缩放
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row1[I], Column1[I], HomMat2DScale)
     *将仿射变换应用于图像
    affine_trans_contour_xld (ModelContours, ContoursAffineTrans1, HomMat2DScale)  
endfor
if (I==1)
    gen_region_contour_xld (ContoursAffineTrans1, Region2, 'filled')
    select_shape (Region2, SelectedRegions, ['area','circularity'], 'and', [100,0.8], [10000,1.0])
    count_obj (SelectedRegions, Number)
    if (Number==2)
     area_center (SelectedRegions, Area, Row, Column)
     distance_pp (Row[0], Column[0], Row[1], Column[1], Distance)
     gen_region_line (RegionLines, Row[0], Column[0], Row[1], Column[1])
     dev_display (ImageSearch)
     dev_display (SelectedRegions)
     dev_display (RegionLines)
     disp_message (WindowHandle, Distance, 'window', 96, 290, 'green', 'true')
    endif
endif

最终的检测结果

完整程序

*读取图像
read_image (Image, 'D:/桌面文件/Halcon/Halcon模块/模板匹配/模板匹配3/1 (1).bmp')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
set_color (WindowHandle, 'green')
*ROI选取区域模板(上部工件的圆形区域)
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage)
edges_sub_pix (GrayImage, Edges, 'canny', 1, 20, 60)
gen_region_contour_xld (Edges, Region, 'filled')
select_shape (Region, SelectedRegions1, 'area', 'and', 150, 1000)
count_obj (SelectedRegions1, Number1)
if (Number1==2)
     area_center (SelectedRegions1, Area1, Row3, Column3)
     distance_pp (Row3[0], Column3[0], Row3[1], Column3[1], Distance1)
     gen_region_line (RegionLines1, Row3[0], Column3[0], Row3[1], Column3[1])
     dev_display (Image)
     dev_display (SelectedRegions1)
     dev_display (RegionLines1)
     disp_message (WindowHandle, Distance, 'window', 96, 290, 'green', 'true')
endif
*模板旋转的角度
create_scaled_shape_model (ImageReduced,5,rad(0),rad(360), 'auto', 0.7,1.0, 'auto', 'auto', 'ignore_local_polarity', 'auto', 'auto', ModelID)
get_shape_model_contours (ModelContours, ModelID, 1)
*得到模板的中心(即要匹配的轮廓的初始位置,不是(0,0)那个轮廓)
area_center (Image, Area, Row, Column)
*//将模板轮廓平移到中心///
*产生模板平移的仿射变换 将(0,0)点的轮廓变换回轮廓的初始位置
vector_angle_to_rigid (0,0,0, Row, Column,0, HomMat2D)
*将仿射变换应用于轮廓
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)

*读取要匹配的图片
read_image (ImageSearch, 'D:/桌面文件/Halcon/Halcon模块/模板匹配/模板匹配3/1 (12).bmp')
*寻找匹配的模板
find_scaled_shape_model (ImageSearch, ModelID,rad(0),rad(360), 0.8, 1.2, 0.8,0, 0.5, 'least_squares', 5, 0.3, Row1, Column1, Angle, Scale, Score)
*逐个显示模型 
for I:= 0 to |Score|-1 by 1
    *建立平移数组
    hom_mat2d_identity (HomMat2DIdentity)
    *平移
    hom_mat2d_translate (HomMat2DIdentity, Row1[I], Column1[I], HomMat2DTranslate)
    *旋转
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row1[I], Column1[I], HomMat2DRotate)
    *缩放
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row1[I], Column1[I], HomMat2DScale)
     *将仿射变换应用于图像
    affine_trans_contour_xld (ModelContours, ContoursAffineTrans1, HomMat2DScale)  
endfor
if (I==1)
    gen_region_contour_xld (ContoursAffineTrans1, Region2, 'filled')
    select_shape (Region2, SelectedRegions, ['area','circularity'], 'and', [100,0.8], [10000,1.0])
    count_obj (SelectedRegions, Number)
    if (Number==2)
     area_center (SelectedRegions, Area, Row, Column)
     distance_pp (Row[0], Column[0], Row[1], Column[1], Distance)
     gen_region_line (RegionLines, Row[0], Column[0], Row[1], Column[1])
     dev_display (ImageSearch)
     dev_display (SelectedRegions)
     dev_display (RegionLines)
     disp_message (WindowHandle, Distance, 'window', 96, 290, 'green', 'true')
    endif
endif
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值