功能:识别图像中的矩形并进行姿态估计
THIK:判断并剔除了矩形和图像边缘相交的情况。通过面积判断相交的方法可学。

  1. 初始化:保留空区域,设置窗口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Width := 800
    Height := 800
    RectWidth := 0.095
    RectHeight := 0.035

    get_system ('clip_region', ClipRegion)
    get_system ('store_empty_region', StoreEmptyRegion)
    get_system ('empty_region_result', EmptyRegionResult)
    * 禁用区域裁剪(默认情况下,如果区域超过图像边界,Halcon会自动将其裁剪到图像范围内。)
    set_system ('clip_region', 'false')、
    * 允许空区域的存储,避免处理它时产生错误
    set_system ('store_empty_region', 'true')
    set_system ('empty_region_result', 'true')

    dev_close_window ()
    dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
    set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
    dev_set_part (0, 0, Height - 1, Width - 1)
    dev_update_off ()
    dev_set_draw ('margin')
  2. 相机参数

    1
    2
    3
    4
    5
    * 标定板文件
    CaltabName := 'caltab_30mm.descr'
    Dir := 'metal-parts'
    * 相机参数
    gen_cam_par_area_scan_division (0.0136446, 830.197, 4.58317e-006, 4.65e-006, 509.153, 487.791, 800, 800, CamParam)
  3. 矩形识别及姿态估计

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    dev_set_colored (12)
    dev_set_line_width (1)
    gen_rectangle1 (ImageBorder, 2, 2, Height - 2, Width - 2)
    * 区域的补集
    complement (ImageBorder, ImageBorder)
    for I := 1 to 5 by 1
    read_image (Image, Dir + '/work_sheet_' + I$'.2')
    dev_display (Image)
    * 均值+二值化,提取亮部区域
    mean_image (Image, ImageMean, 201, 201)
    dyn_threshold (Image, ImageMean, Region, 0, 'light')
    * 填充、分离、腐蚀、膨胀、然后按照面积,凸度和矩形度筛选矩形
    fill_up (Region, RegionFillUp)
    connection (RegionFillUp, ConnectedRegions)
    erosion_circle (ConnectedRegions, RegionErosion, 3.5)
    dilation_circle (RegionErosion, RegionDilation, 3.5)
    select_shape (RegionDilation, Objects, ['area', 'convexity', 'rectangularity'], 'and', [2000, 0.9, 0.8], [4000000, 1, 1])
    * 计算矩形和图像边界的交集区域
    intersection (Objects, ImageBorder, RegionIntersection)
    area_center (RegionIntersection, Area, Row, Column)
    * 筛选不与边界相交的矩形对象
    select_mask_obj (Objects, RectangularRegions, Area [==] 0)
    * 利用矩形区域和相机参数估计矩形物体的姿态
    find_pose_from_region (RectangularRegions, Image, CamParam, WindowHandle, RectWidth, RectHeight, 'small_detail/cut_edges', PoseSmallField)
    if (|PoseSmallField| > 0)
    display_3D_detail (PoseSmallField, RectWidth, RectHeight, CamParam)
    endif
    if (I < 5)
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    endif
    endfor
  4. 恢复系统参数

    1
    2
    3
    set_system ('clip_region', ClipRegion)
    set_system ('store_empty_region', StoreEmptyRegion)
    set_system ('empty_region_result', EmptyRegionResult)