HALCON示例程序measure_ring.hdev齿轮齿宽度测量

HALCON示例程序measure_ring.hdev齿轮齿宽度测量

示例程序源码(加注释)

  • 关于显示类函数解释
    read_image (Image, ‘rings_and_nuts’)
    dev_close_window ()
    dev_open_window_fit_image (Image, 0, 0, 640, 640, WindowHandle)
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    get_image_size (Image, Width, Height)
  • 使用灰度直方图分割图像
    binary_threshold (Image, Region, ‘max_separability’, ‘dark’, UsedThreshold)
    connection (Region, ConnectedRegions)
    fill_up (ConnectedRegions, RegionFillUp)
  • 返回区域紧凑度
    compactness (RegionFillUp, Compactness)
    for i := 0 to |Compactness| - 1 by 1
    if (Compactness[i] > 1.5 and Compactness[i] < 2.5)
    select_obj (RegionFillUp, ObjectSelected, i + 1)
    * 最小外接圆
    smallest_circle (ObjectSelected, Row, Column, RadiusMax)
    * 最大内接圆
    inner_circle (ObjectSelected, CenterRow, CenterCol, RadiusMin)
    Radius := (RadiusMax + RadiusMin) / 2.0
    AnnulusRadius := (RadiusMax - RadiusMin) / 4.0
    * 得到区域轮廓的多边形
    get_region_polygon (ObjectSelected, AnnulusRadius, RowsBorder, ColumnsBorder)
    SqrDistanceBorder := (RowsBorder - CenterRow) * (RowsBorder - CenterRow) + (ColumnsBorder - CenterCol) * (ColumnsBorder - CenterCol)
    * 按照升序对数组排序并返回索引号
    tuple_sort_index (SqrDistanceBorder, Indices)
    * 求取线性角度
    line_orientation (CenterRow, CenterCol, RowsBorder[Indices[0]], ColumnsBorder[Indices[0]], AngleStart)
    AngleExtent := rad(360)
    Interpolation := ‘bilinear’
    * 准备提取垂直于环形弧的直边。
    gen_measure_arc (CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation, MeasureHandle)
    Sigma := 1.0
    Threshold := 30
    Transition := ‘negative’
    Select := ‘all’
    * 提取垂直于矩形或环形弧的直边对。
    measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
    distance_pp (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, LinearDistance)
    AngularDistance := deg(IntraDistance / Radius)
    gen_empty_obj (Crosses)
    for J := 0 to |RowEdgeFirst| - 1 by 1
    gen_cross_contour_xld (Cross1, RowEdgeFirst[J], ColumnEdgeFirst[J], 12, atan2(CenterRow - RowEdgeFirst[J],ColumnEdgeFirst[J] - CenterCol))
    gen_cross_contour_xld (Cross2, RowEdgeSecond[J], ColumnEdgeSecond[J], 12, atan2(CenterRow - RowEdgeSecond[J],ColumnEdgeSecond[J] - CenterCol))
    concat_obj (Crosses, Cross1, Crosses)
    concat_obj (Crosses, Cross2, Crosses)
    endfor
    dev_display (Image)
    dev_set_line_width (2)
    dev_set_color (‘green’)
    dev_display (Crosses)
    Message := 'Number of cogs: ' + |RowEdgeFirst| Message[1] := 'Mean cog size:' Message[2] := '- Arc length: ' + mean(IntraDistance)$'.2f' + ' +/- ' + deviation(IntraDistance)$'.2f' + ' pixel' Message[3] := '- Linear: ' + mean(LinearDistance)$'.2f' + ' +/- ' + deviation(LinearDistance)$'.2f' + ' pixel' Message[4] := '- Angular: ' + mean(AngularDistance)$'.2f' + ' +/- ' + deviation(AngularDistance)$'.2f' + ' deg' disp_message (WindowHandle, Message, 'window', 260, 10, 'black', 'true')
    close_measure (MeasureHandle)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()
    endif
    endfor

处理思路

这个例子是主要讲解了如何使用gen_measure_arc、measure_pairs 搭配提取垂直圆弧的直边。

后记

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值