Halcon视觉检测——2D Metrology测量小结(一)

本文详细介绍了如何在Halcon中利用2DMetrology模块进行亚像素级别的测量,包括创建测量模型、设置对象大小、添加测量对象(如圆、椭圆、直线和矩形)并应用测量。通过示例展示了对元件中心与缺口角度的精确测量过程,涉及到图像处理的多个步骤,如阈值处理、轮廓拟合和直线检测。最后,文章演示了如何获取和显示测量结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值