在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。
结果如下:
- 北京网信办等部门联合约谈,京东回应认真接受批评,全面严肃整改 2018-04-02
- 青腾汇私访|保利的野心,再入局万亿级社区消费 2018-04-02
- 机械革命深海幽灵Z2,开启游戏本全面屏时代! 2018-04-02
- 拼多多“低价爆款”的全部秘密,都在这家年销量过亿的工厂里 2018-04-02
- 太疯狂!外卖员闯灯924次,1天闯5次,最高一天18次 2018-04-02
- 滴滴回应女乘客怀疑司机不轨:正核实 向当事人致歉 2018-04-02
- 暴风TV发布40吋电视暴风AI电视4(40X)售价999元 2018-04-02
- ofo否认愚人节传言“与摩拜正商谈合并” 2018-04-02
- 苹果股价3月份下跌5.8% 曾连续6个交易日下跌 2018-04-02
- 天宫一号再入大气层坠落南太平洋中部:欢迎你回家! 2018-04-02
- 1.form
- 2.strtolower()
- 3.font
- 4.background-origin
- 5.transition-delay
- 6.选择器:empty
- 7.line-height
- 8.PHP Timezones
- 9.选择器:disabled
- 10.font-size