• 跟我学机器视觉HALCON学习例程中文详解测量圆环脚宽间距


    跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距

    • This example program demonstrates the basic usage of a circular measure object.

    • Here, the task is to determine the width of the cogs.

    *首先读取图像,获取图像的宽度和高度

    • First, read in the image and initialize the program.

    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)

    *读到的图像如下:

    • Extract the rings.

    自动阈值分割,此时为一个区域,如图*********

    bin_threshold (Image, Region)

    **********进行连通区域划分,不同的区域用不同的颜色表示,如图:

    connection (Region, ConnectedRegions)

    *填充区域内的孔洞,效果如图

    fill_up (ConnectedRegions, RegionFillUp)

    **计算区域的紧性,机器视觉算法与应用第168页

    compactness (RegionFillUp, Compactness)

    ****通过紧性特征进行区域筛选,在1.5到2.5之间的为需要测量的圆环

    for i := 0 to |Compactness|-1 by 1

    if (Compactness[i] > 1.5 and Compactness[i] < 2.5)
    
        select_obj (RegionFillUp, ObjectSelected, i+1)
        
        * Determine the size and position of the rings.
    

    计算选择区域的最小外接圆和最大内接圆,存储圆心和半径

    两个半径的均值作为测量圆弧半径,AnnulusRadius 为测量圆弧宽度******************

        smallest_circle (ObjectSelected, Row, Column, RadiusMax)
    
        inner_circle (ObjectSelected, CenterRow, CenterCol, RadiusMin)
    
        Radius := (RadiusMax+RadiusMin)/2.0
    
        AnnulusRadius := (RadiusMax-RadiusMin)/4.0
        
        * Determine the position between two cogs.
    
        * This position is then used as the start angle for the circular ROI.
    

    ********多边形近似逼近区域,存储多边形角点的坐标值,机器视觉算法与应用第252页

        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)
    

    我认为检测圆开始角度直接设为0度也可以**************

    •   AngleStart := rad(0)
      
        AngleExtent := rad(360)
        
        * Create the measure for a circular ROI.
      
        Interpolation := 'bilinear'
      

    生成测量圆弧,为完整圆环(360度)***

        gen_measure_arc (CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation, MeasureHandle)
        
        * Determine all edge pairs that have a negative transition, i.e., edge pairs
    
        * that enclose dark regions.
    
        * Note that the output parameters IntraDistance and InterDistance are given as arc lengths.
    
        Sigma := 1.0
    
        Threshold := 30
    
        Transition := 'negative'
    
        Select := 'all'
    

    ***进行边缘对测量,RowEdgeFirst, ColumnEdgeFirst,RowEdgeSecond, ColumnEdgeSecond为检测圆弧检测到的边界的中心点的坐标,
    IntraDistance, InterDistance分别为边缘对间的距离和边缘对的弧线距离

        measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
        
        * Determine the number of cogs.
    
        NumCogs := |RowEdgeFirst|
        
        * Determine the linear distance between the two edges of each edge pair ('Linear cog size')
    
        * as well as the angular distance of the edge pairs ('Angular cog size').
    

    计算边缘对的直线距离和弧度*

        distance_pp (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, LinearDistance)
    
        AngularDistance := deg(IntraDistance/Radius)
    

     Visualize the determined edges.

    将边缘对的起始终止点画出,并显示测量结果****

        gen_empty_obj (Crosses)
    
        for i := 0 to |RowEdgeFirst|-1 by 1
    
            gen_cross_contour_xld (Cross, RowEdgeFirst[i], ColumnEdgeFirst[i], AnnulusRadius*2.0, atan2(RowEdgeFirst[i]-CenterRow,ColumnEdgeFirst[i]-CenterCol))
    
            concat_obj (Crosses, Cross, Crosses)
    
            gen_cross_contour_xld (Cross, RowEdgeSecond[i], ColumnEdgeSecond[i], AnnulusRadius*2.0, atan2(RowEdgeSecond[i]-CenterRow,ColumnEdgeSecond[i]-CenterCol))
    
            concat_obj (Crosses, Cross, Crosses)
    
        endfor
    
        dev_display (Image)
    
        dev_set_line_width (4)
    
        dev_set_color ('black')
    
        dev_display (Crosses)
    
        dev_set_line_width (1)
    
        dev_set_color ('white')
    
        dev_display (Crosses)
       
        * Display the measured size of the cogs.
    
        disp_message (WindowHandle, 'Number of cogs: '+|RowEdgeFirst|+'                 ', 'window', 260, 10, 'black', 'true')
    
        disp_message (WindowHandle, 'Mean cog size:                    ', 'window', 286, 10, 'black', 'true')
    
        disp_message (WindowHandle, '- Arc length: '+mean(IntraDistance)$'.2f'+' +/- '+deviation(IntraDistance)$'.2f'+' pixel', 'window', 310, 10, 'black', 'true')
    
        disp_message (WindowHandle, '- Linear:     '+mean(LinearDistance)$'.2f'+' +/- '+deviation(LinearDistance)$'.2f'+' pixel', 'window', 334, 10, 'black', 'true')
    
        disp_message (WindowHandle, '- Angular:    '+mean(AngularDistance)$'.2f'+' +/- '+deviation(AngularDistance)$'.2f'+' deg  ', 'window', 358, 10, 'black', 'true')
        * 
        * Close the measure
    
        close_measure (MeasureHandle)
    
        disp_continue_message (WindowHandle, 'black', 'true')
    
        stop ()
    
    endif
    

    for循环,测量其他圆环*****

    endfor

  • 相关阅读:
    557. Reverse Words in a String III
    14. Longest Common Prefix
    linux 修改系统时间 同步网络时间
    Django学习
    mysql操作
    mysql ,shell代码
    mysql学习
    Mac环境下mysql安装以及登录
    Mac自带Apache服务器的使用
    MongoDB连接数据库
  • 原文地址:https://www.cnblogs.com/chita/p/3620935.html
Copyright © 2020-2023  润新知