zoukankan      html  css  js  c++  java
  • Halcon中缩放Region或XLD的方法研究

    在Halcon中,Region和XLD之间可以彼此转换。但这种转换并不是“无损”的,XLD可以是不闭合的,但是Region一定是闭合的。因此,如果将不闭合的XLD转为Region,然后再转回XLD,那么转换后的XLD和原先的XLD就有了一定的区别。

     

    言归正传,先说说Region的缩放。

     

    一、Region的缩放

    Region的缩放很简单,有zoom_region算子,其签名如下,其中ScaleWidth, ScaleHeight是宽、高的缩放比例因子:

    zoom_region(Region : RegionZoom : ScaleWidth, ScaleHeight : )

     

    缩放的时候,Row和Column都根据缩放比例因子来放大或缩小。因此缩放后,Region的位置会移位,如果不想让缩放后的Region移位,可以这样:

    set_system ('clip_region', 'false')
    zoom_region (Region, RegionZoom, 0.5, 0.5)
    
    area_center (Region, Area, Row, Column)
    area_center (RegionZoom, Area1, Row1, Column1)
    move_region (RegionZoom, RegionMoved, Row - Row1, Column - Column1)

    需要注意的是,Region缩放后,经常会有一部分跑到画布外面,Halcon默认是将画布外部的Region进行裁切的,如果不想裁切,可以在程序开始加上set_system ('clip_region', 'false'),即不裁切画布外面的部分。

     

     

    二、XLD的缩放

    本文开头分析过,“XLD——Region——XLD”的转换不是无损的,但是如果不介意这一点(或者说影响不大),XLD的缩放就可以通过Region的缩放为中介。

     

    1、使用Region为中介缩放XLD

    1 gen_image_const (Image, 'byte', 8200, 4200)
    2 set_system ('clip_region', 'false')
    3 read_contour_xld_dxf (Contours,'01.dxf', [], [], DxfStatus)
    4 *转为region
    5 gen_region_contour_xld (Contours, Region, 'margin')
    6 *缩放region
    7 zoom_region (Region, RegionZoom, 0.2, 0.2)
    8 *转回XLD
    9 gen_contour_region_xld (RegionZoom, Contours2, 'border')

     

    如果是下面这样的XLD呢?

    用上面的方法的话,发现结果完全不对,如下图:

     

    那么应该怎么弄呢?

     

    2、通过缩放XLD中每个点的坐标值来缩放XLD

     1 gen_image_const (Image, 'byte', 8200, 4200)
     2 set_system ('clip_region', 'false')
     3 read_contour_xld_dxf (Contours,'02.dxf', [], [], DxfStatus)
     4 count_obj (Contours, Num)
     5 
     6 *XLD上点的采样间隔(为了缩短处理时间)
     7 Step := 10
     8 *缩放比例
     9 Scale := 0.3
    10 gen_empty_obj (Contour2)
    11 for i := 1 to Num by 1
    12     select_obj (Contours, Contour, i)
    13     get_contour_xld (Contour, Row, Col)
    14     Row1 := []
    15     Col1 := []
    16     for j := 0 to |Row|-1 by Step
    17         
    18         Row1:=[Row1,Row[j] * Scale]
    19         Col1:=[Col1,Col[j] * Scale]
    20         
    21     endfor
    22     
    23     *判断轮廓是不是闭合,如果是闭合的,那么使最后一个点与第一个点重合(即让缩放后的XLD也闭合)
    24     test_closed_xld (Contour, IsClosed)
    25     if (IsClosed == 1)
    26         Row1:=[Row1,Row[0] * Scale]
    27         Col1:=[Col1,Col[0] * Scale]
    28     endif
    29     
    30     gen_contour_polygon_xld (Contour1, Row1, Col1)
    31     smooth_contours_xld (Contour1, SmoothedContours, 5)
    32     concat_obj (Contour2, SmoothedContours, Contour2)
    33 endfor

     其中:

    get_contour_xld (Contour, Row, Col)是得到XLD中的一系列点;

    gen_contour_polygon_xld (Contour1, Row1, Col1)是通过一系列点重建XLD。

    结果如下:

     

    (读者朋友们如果有不理解的地方或者发现有错误,欢迎跟帖回复。2017年8月22日  深夜)

  • 相关阅读:
    P2765 魔术球问题 网络流二十四题重温
    搬东西 dp
    Q
    P2774 方格取数问题 网络流重温
    2019牛客暑期多校训练1
    E. A Simple Task
    Codeforces Round #575 (Div. 3) 昨天的div3 补题
    自动化测试如何准备测试数据
    金三银四,资深HR给面试者的十大建议
    我的自动化测试之路[转载]
  • 原文地址:https://www.cnblogs.com/xh6300/p/7414256.html
Copyright © 2011-2022 走看看