功能:识别图像中的矩形并进行姿态估计
THIK:判断并剔除了矩形和图像边缘相交的情况。通过面积判断相交的方法可学。
初始化:保留空区域,设置窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Width := 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')相机参数
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)矩形识别及姿态估计
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
32dev_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恢复系统参数
1
2
3set_system ('clip_region', ClipRegion)
set_system ('store_empty_region', StoreEmptyRegion)
set_system ('empty_region_result', EmptyRegionResult)