欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > halcon几何测量(一)3d_position_of_rectangle

halcon几何测量(一)3d_position_of_rectangle

2025/3/19 20:52:25 来源:https://blog.csdn.net/m0_37737957/article/details/146339469  浏览:    关键词:halcon几何测量(一)3d_position_of_rectangle

目录

  • 一、提取目标区域,选择不和边缘相交的目标
  • 二、计算矩形工件的姿态
  • 三、显示矩形的立体结构

一、提取目标区域,选择不和边缘相交的目标

1、提取目标区域:mean_image 、dyn_threshold 、fill_up 、connection 、select_shape
2、选择不和边缘相交的目标:intersection 、area_center 、select_mask_obj

read_image (Image, Dir + '/work_sheet_' + I$'.2')
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)

find_pose_from_region (RectangularRegions, Image, CamParam, WindowHandle, RectWidth, RectHeight, ‘small_detail/cut_edges’, PoseSmallField):
1、膨胀和腐蚀差值得到轮廓区域:dilation_rectangle1 、dilation_rectangle1 、difference、select_shape
2、轮廓计算函数得到四边形的四条边和四个顶点:edges_sub_pix 、segment_contours_xld、select_contours_xld 、union_adjacent_contours_xld 、fit_line_contour_xld、intersection_lines
3、根据图像上的轮廓、相机参数、工件真实尺寸、判断出工件在相机坐标系的姿态:get_rectangle_pose
4、最后加了个方向判定,是为了让后续的显示函数显示的box是明显的。

dilation_rectangle1 (RectangularRegions, RectDilated, 9, 9)
erosion_rectangle1 (RectangularRegions, RectEroded, 9, 9)
difference (RectDilated, RectEroded, RectBorders)
select_shape (RectBorders, RectBorders, 'area', 'and', 600, 99999)
count_obj (RectBorders, Number)
for I := 1 to Number by 1select_obj (RectBorders, RectSelected, I)reduce_domain (Image, RectSelected, ImageReduced)edges_sub_pix (ImageReduced, Edges, 'canny', 0.7, 20, 30)count_obj (Edges, NumberEdges)if (NumberEdges == 0)return ()endifsegment_contours_xld (Edges, ContoursSplit, 'lines', 7, 4, 2)select_contours_xld (ContoursSplit, SelectedEdges, 'contour_length', 70, 1000, -0.5, 0.5)union_adjacent_contours_xld (SelectedEdges, UnionContours, 10, 1, 'attr_keep')count_obj (UnionContours, NumberFilteredEdges)if (NumberFilteredEdges != 4)return ()endiffit_line_contour_xld (UnionContours, 'tukey', -1, 0, 5, 2, RowBegin, ColumnBegin, RowEnd, ColumnEnd, Nr, Nc, Dist)for J := 0 to 3 by 1intersection_lines (RowBegin[J], ColumnBegin[J], RowEnd[J], ColumnEnd[J], RowBegin[(J + 1) % 4], ColumnBegin[(J + 1) % 4], RowEnd[(J + 1) % 4], ColumnEnd[(J + 1) % 4], Row, Column, IsOverlapping)gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)Rows[J] := RowColumns[J] := Columnendfor* Merge pointsFinalRow := []FinalColumn := []for J := 1 to 4 by 1select_obj (UnionContours, Edge, J)get_contour_xld (Edge, RowEdge, ColumnEdge)FinalRow := [FinalRow,RowEdge[5:|RowEdge| - 5],Rows[J - 1]]FinalColumn := [FinalColumn,ColumnEdge[5:|ColumnEdge| - 5],Columns[J - 1]]endforgen_contour_polygon_xld (Quadrangle, FinalRow, FinalColumn)count_obj (Quadrangle, NumberEdges)if (NumberEdges > 0)close_contours_xld (Quadrangle, ClosedContours)get_rectangle_pose (ClosedContours, CamParam, RectWidth, RectHeight, 'tukey', 2, Poses, PoseCov, Error)ErrorAgain := ErrorVarif (ErrorAgain == H_MSG_TRUE)* Store posePose := Poses[0:6]pose_to_hom_mat3d (Pose, HomMat3D)affine_trans_point_3d (HomMat3D, [0, 0], [0, 0], [0, 1], Qx, Qy, Qz)* Invert (if necessary) direction of z axis to point towards the cameraif (Qz[1] - Qz[0] > 0)Pose[4] := Pose[4] + 180Pose[5] := -Pose[5]endifPoseOut := [PoseOut,Pose]endifendif
endfor

三、显示矩形的立体结构

世界坐标系:就是矩形工件为中心,长边平行X轴的坐标系
创建一个平行于这个平面Z=0.01的平面再变换到图像上显示出来。

if (|PoseSmallField| > 0)display_3D_detail (PoseSmallField, RectWidth, RectHeight, CamParam)
endif

display_3D_detail (Pose, RectWidth, RectHeight, CamParam)

dev_set_line_width (3)
pose_to_hom_mat3d (Pose, HomMat3D)
hW := RectWidth / 2
hH := RectHeight / 2
Ofst := 0.005
XCoord := [hW,hW - Ofst,-hW + Ofst,-hW,-hW,-hW + Ofst,hW - Ofst,hW,hW]
XCoord := [XCoord,XCoord]
YCoord := [hH - Ofst,hH,hH,hH - Ofst,-hH + Ofst,-hH,-hH,-hH + Ofst,hH - Ofst]
YCoord := [YCoord,YCoord]
tuple_gen_const (9, 0.01, ZCoord)
ZCoord := [ZCoord,0, 0, 0, 0, 0, 0, 0, 0, 0]
affine_trans_point_3d (HomMat3D, XCoord, YCoord, ZCoord, Qx, Qy, Qz)
project_3d_point (Qx, Qy, Qz, CamParam, Row, Column)
gen_contour_polygon_xld (Cover, Row[9:17], Column[9:17])
dev_set_color ('green')
dev_display (Cover)
gen_contour_polygon_xld (Bottom, Row[0:8], Column[0:8])
dev_set_color ('blue')
dev_display (Bottom)
dev_set_color ('red')
for J := 0 to 8 by 1gen_contour_polygon_xld (Edge, [Row[J],Row[J + 9]], [Column[J],Column[J + 9]])dev_display (Edge)
endfor

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词