1. 程式人生 > >Halcon中縮放Region或XLD的方法研究

Halcon中縮放Region或XLD的方法研究

不想 讀者 logs status 錯誤 比例 使用 for mov

在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日 深夜)

Halcon中縮放Region或XLD的方法研究