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

2021-08-10 10:16:42 字數 3108 閱讀 6652

在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

5gen_region_contour_xld (contours, region, 'margin')

6 *縮放region

7zoom_region (region, regionzoom, 0.2, 0.2)

8 *轉回xld

如果是下面這樣的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)

4count_obj (contours, num)56

*xld上點的取樣間隔(為了縮短處理時間)

7step := 10

8*縮放比例

9scale := 0.3

10gen_empty_obj (contour2)

11for i := 1 to num by 1

12select_obj (contours, contour, i)

13get_contour_xld (contour, row, col)

14 row1 :=

15 col1 :=

16for j := 0 to |row|-1

by step

1718

row1:=[row1,row[j] * scale]

19col1:=[col1,col[j] * scale]

2021

endfor

2223

*判斷輪廓是不是閉合,如果是閉合的,那麼使最後乙個點與第乙個點重合(即讓縮放後的xld也閉合)

24test_closed_xld (contour, isclosed)

25if (isclosed == 1)

26row1:=[row1,row[0] * scale]

27col1:=[col1,col[0] * scale]

28endif

2930

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。

結果如下:

halcon獲得線段 region 的端點

在halcon演算法中我們可能會需要求得線段也就是line的端點,那麼怎樣才可以得到呢?主要用到下邊的 skeleton regionlines,skeleton junctions skeleton regionlines,endpoints,juncpoints get region point...

C 中 region和 if的作用

region 提示資訊 endregion 作用 摺疊並隱藏 別且摺疊以後能夠顯示白字 提示資訊 如下圖就是使用了 region和 endregion if else endif 作用 控制編譯的 例如 if condition a else b endif 如果condition為真,則程式編譯的...

halcon中面到面的距離 Halcon標定步驟

halcon標定步驟 1.設定相機內部引數的初始值 startcampar 0.016,0,0.0000074,0.0000074,326,247,652,494 set calib data cam param calibdataid,0,area scan division startcampa...