HALCON示例程序circles.hdev边界轮廓的圆形拟合

HALCON示例程序circles.hdev边界轮廓的圆形拟合

小哥哥小姐姐觉得有用点个赞呗!
在这里插入图片描述

示例程序源码(加注释)

  • 读入图片
    read_image (Image, ‘double_circle’)
  • 窗口初始化
    dev_close_window ()
    get_image_size (Image, Width, Height)
    dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)
  • 将区域分割出来并且去除边界
  • 快速阈值分割
    fast_threshold (Image, Region, 0, 120, 7)
  • 使用形态学运算来计算区域的边界,这里就是将图片边界提取出来
    boundary (Region, RegionBorder, ‘inner’)
  • 剪切最小外接矩形内缩的区域
    函数原型clip_region_rel(Region : RegionClipped : Top, Bottom, Left, Right : )
    Region :输入区域;RegionClipped :输出区域缩小的区域;Top, Bottom, Left, Right:内缩量
    外接矩形内缩后与原有外接矩形形成一个矩形环,就是将区域减去这个矩形环生成的区域。

    clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)
  • 使用半径为2.5的圆形元素对区域进行膨胀
    dilation_circle (RegionClipped, RegionDilation, 2.5)
  • 减少图像定义域
    reduce_domain (Image, RegionDilation, ImageReduced)

提取边缘

  • edges_sub_pix - 使用Deriche,Lanser,Shen或Canny过滤器提取亚像素精确边缘
    函数原型:edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
    Image :输入图像;Edges :输出的边缘;Alpha:滤波器宽度;
    Low:滞后阈值操作的阈值下限;High: 滞后阈值操作的阈值上限

    edges_sub_pix (ImageReduced, Edges, ‘canny’, 2, 20, 60)
  • segment_contours_xld - 分割XLD轮廓为线段和圆弧或椭圆弧
    函数原型;segment_contours_xld(Contours : ContoursSplit :
    Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
    Contours :输入轮廓;ContoursSplit:分割后的轮廓;Mode:轮廓分割模式;
    SmoothCont:用于平滑轮廓的点数;MaxLineDist1:轮廓与近似线之间的最大距离(第一次迭代);
    MaxLineDist2 :轮廓与近似线之间的最大距离(第二次迭代)

    segment_contours_xld (Edges, ContoursSplit, ‘lines_circles’, 5, 4, 3)
  • 对区域元素进行计数
    count_obj (ContoursSplit, Number)
    显示
    dev_display (Image)
    dev_set_draw (‘margin’)
    dev_set_color (‘white’)
    dev_update_window (‘off’)
    for I := 1 to Number by 1
    • 通过索引号选取数组内的指定元素
      select_obj (ContoursSplit, ObjectSelected, I)
    • 返回XLD轮廓的全局属性值’cont_approx’表示:对于’cont_approx’=-1,轮廓近似线段;
    • ‘cont_approx’=0,曲线近似椭圆;‘cont_approx’=1,曲线近似圆弧。
      get_contour_global_attrib_xld (ObjectSelected, ‘cont_approx’, Attrib)
    • 圆弧线段进行圆形拟合
      if (Attrib > 0)
      • fit_circle_contour_xld 对XLD轮廓进行圆弧拟合。
        fit_circle_contour_xld (ObjectSelected, ‘ahuber’, -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
      • 绘制拟合出来的圆
        gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), ‘positive’, 1.0)
        dev_display (ContCircle)
        endif
        endfor
  • 显示设置与显示
    dev_set_colored (12)
    dev_set_line_width (3)
    dev_display (ContoursSplit)

处理思路

这个例子是集边界提取、边界分割、边界拟合于一个程序,进行了实际的讲解。这个例子当中的关于xld操作的算子以后我们做边界提取、测量时会用到很多。

后记

大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值