Halcon視覺檢測——2D Metrology測量小結(一)

Halcon中的2D Metrology模塊提供了亞像素級別的卡尺測量功能。主要針對圓/圓弧、橢圓/橢圓弧、直線、rectangle2矩形創建測量對象。

步驟

一般首次使用2D Metrology測量工具有如下步驟:

  1. 創建測量模型;使用create_metrology_model();
  2. 設置測量對象圖像的大小;使用set_metrology_model_image_size();
  3. 提供近似值;將測量對象添加到模型中,同時將測量對象的近似參數和控制測量的參數添加到模型中。
    主要通過以下算子實現對應對象的添加:
  • add_metrology_object_circle_measure() 將圓或圓弧添加到度量模型中
  • add_metrology_object_ellipse_measure() 將橢圓或橢圓弧添加到度量模型中
  • add_metrology_object_line_measure() 將直線添加到度量模型中
  • add_metrology_object_rectangle2_measure() 將一個矩形添加到度量模型中
  • add_metrology_object_generic()創建幾個不同幾何形狀的測量
    其中,模型參數的設置也可以通過set_metrology_model_param()完成,如果模型中有多個測量形狀需要設置則可以通過 set_metrology_object_param()進行設置。
    4.應用測量;使用apply_metrology_model()將測量應用到指定圖像中。
    5.獲取結果;
    6.清除內存;使用clear_metrology_model()銷燬模型。

測量示例

如圖,計算圖中元件的中心與缺口角度問題:

在這裏插入圖片描述

read_image (Image, 'uranium_targeting_256.bmp')
try
    get_image_size (Image, Width, Height)
    auto_threshold (Image, Regions, 5)
    fill_up (Regions, RegionFillUp)
    select_shape_std (RegionFillUp, SelectedRegions1, 'max_area', 70)
    reduce_domain (Image, SelectedRegions1, ImageReduced1)
    threshold (ImageReduced1, Region2, 0, 150)
    connection (Region2, ConnectedRegions5)
    fill_up (ConnectedRegions5, RegionFillUp2)
    select_shape_std (RegionFillUp2, SelectedRegions4, 'max_area', 70)
    opening_circle (SelectedRegions4, RegionOpening, 10)
    gen_contour_region_xld (RegionOpening, Contours, 'border')
    fit_circle_contour_xld (Contours, 'atukey', -1, 0, 0, 3, 2, CircleCenterRow, CircleCenterColumn, CircleCenterRadius, StartPhi1, EndPhi1, PointOrder1)
    gen_circle_contour_xld (ContCircle1, CircleCenterRow, CircleCenterColumn, CircleCenterRadius, 0, 6.28318, 'positive', 1)
    gen_region_contour_xld (Contours, Region3, 'margin')
    gen_region_contour_xld (ContCircle1, Region, 'margin')
    
    shape_trans (RegionOpening, RegionTrans, 'rectangle2')
    erosion_circle (RegionTrans, RegionErosion, 30)
    difference (Region3, RegionErosion, RegionDifference)
    connection (RegionDifference, ConnectedRegions4)
    select_shape_std (ConnectedRegions4, SelectedRegions3, 'max_area', 70)
    dilation_circle (SelectedRegions3, RegionDilation, 5)
    skeleton (RegionDilation, Skeleton1)
    gen_contours_skeleton_xld (Skeleton1, Contours2, 10, 'filter')
    fit_line_contour_xld (Contours2, 'tukey', -1, 0, 5, 2.0, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
    gen_region_line (RegionLines, RowBegin, ColBegin, RowEnd, ColEnd)
    intersection (RegionLines, Region, RegionIntersection2)
    connection (RegionIntersection2, ConnectedRegions1)
    * 直線檢測的起始點與終止點
    area_center (ConnectedRegions1, Area4, LineRegionRow, LineRegionColumn)
    **卡尺精定位部分
    create_metrology_model (MetrologyHandle)
    set_metrology_model_image_size (MetrologyHandle, Width, Height)
    add_metrology_object_circle_measure (MetrologyHandle, CircleCenterRow, CircleCenterColumn, CircleCenterRadius, 10, 5, 1.5, 20, ['measure_transition','min_score'], ['positive',0.5], MetrologyCircleIndex)
    apply_metrology_model (Image, MetrologyHandle)
    get_metrology_object_result (MetrologyHandle, MetrologyCircleIndex, 'all', 'result_type', 'all_param', CircleParameter)   
    add_metrology_object_line_measure (MetrologyHandle, LineRegionRow[0], LineRegionColumn[0], LineRegionRow[1], LineRegionColumn[1], 10, 5, 1, 20, ['measure_transition','min_score'], ['uniform',0.5], MetrologyLineIndex)   
    apply_metrology_model (Image, MetrologyHandle)
    get_metrology_object_result (MetrologyHandle, MetrologyLineIndex, 'all', 'result_type', 'all_param', LineParameter)    
    ** 顯示信息
    get_metrology_object_result_contour (MetrologyCircleContour, MetrologyHandle, MetrologyCircleIndex, 'all', 1.5)
    get_metrology_object_result_contour (MetrologyLineContour, MetrologyHandle, MetrologyLineIndex, 'all', 1.5)
    gen_region_line (RegionLinesH, LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3])
    * *** Output ****
    if (LineParameter[1]<LineParameter[3])
        angle_lx (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], Angle)
    else
        angle_lx (LineParameter[2], LineParameter[3], LineParameter[0], LineParameter[1], Angle)
    endif
    gen_region_line (RegionLinesX, Height/2, 0, Height/2, Width)
    gen_region_line (RegionLinesY, 0, Width/2, Height, Width/2)
    gen_cross_contour_xld (Cross, CircleParameter[0], CircleParameter[1], 30, 1)   
    get_metrology_object_measures (Contours1, MetrologyHandle, 'all', 'all', Row2, Column2)
    **顯示
    tuple_rad (180, Rad)
    gen_rectangle2 (Rectangle, CircleParameter[0], CircleParameter[1], Angle+Rad/2.0, 1.2*CircleParameter[2], 2)
    intersection (Rectangle, RegionLines, RegionIntersection)
    area_center (RegionIntersection, Area, Row, Column)
    gen_region_line (RegionLines1, CircleParameter[0], CircleParameter[1], Row, Column)

    dev_display (Image)
    dev_set_line_width (2)
    dev_set_color ('red')
    dev_display (Cross)
    dev_display (MetrologyCircleContour)
    dev_set_color ('cyan')
    dev_display (MetrologyLineContour)
    dev_set_color ('blue')
    dev_display (RegionLines1)
    disp_arrow (3600, CircleParameter[0], CircleParameter[1], Row, Column, 2)
    dev_set_color ('green')
    dev_display (Contours1)
    dev_set_color ('yellow')
    gen_cross_contour_xld (Cross1, Row2, Column2, 6, 0)   
    disp_arrow (3600, CircleParameter[0], CircleParameter[1], Row, Column, 2)
    tuple_deg (Angle + Rad/2.0, Deg)
    if (Row>CircleParameter[0])
        ReturnDeg := Deg - 180
    elseif(Row<CircleParameter[0])
        ReturnDeg := Deg
    elseif (Row==CircleParameter[0] and Column>CircleParameter[1])
        ReturnDeg := 0
    elseif (Row==CircleParameter[0] and Column<CircleParameter[1])
        ReturnDeg := 180
    endif
    DRow := CircleParameter[0] - Height/2
    DColumn := CircleParameter[1] - Width/2
    disp_message (3600, 'DRow    := ' + DRow, 'window', 20, 20, 'black', 'true')
    disp_message (3600, 'DColumn := ' + DColumn, 'window', 40, 20, 'black', 'true')
    disp_message (3600, 'Angle   := ' + ReturnDeg, 'window', 60, 20, 'black', 'true')
    clear_metrology_model (MetrologyHandle)
    stop ()
    catch (Exception)
        dev_display (Image)
        disp_message (3600, Exception, 'window', 20, 20, 'black', 'true')
        disp_message (3600, 'NULL', 'window', 20, 20, 'black', 'true')
        stop ()
endtry

輸出結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章