如何在Halcon中为图像绘制3D方向箭头以展示点云朝向?
在Halcon中渲染点云时添加小型3D方向箭头的实用方案
给你几个直接可行的思路,不用纠结2D箭头的像素叠加问题:
1. 自定义小型3D箭头模型,和点云合并渲染
手动创建迷你箭头的3D顶点数据,生成独立的3D对象模型,旋转到和点云一致的朝向,再和点云模型合并后一起渲染,完美适配点云的视角。
示例代码:
* 定义小型箭头的3D顶点(杆+箭头头部) ArrowPoints := [0,0,0, 0.5,0,0, 0.4,0.1,0, 0.5,0,0, 0.4,-0.1,0] gen_object_model_3d_from_points(ArrowPoints, [], [], ArrowModel) * 按点云绕Z轴的旋转角Theta旋转箭头 Theta := 30 * rad(1) // 替换为你的实际旋转角度 hom_mat3d_identity(HomMat3DIdentity) hom_mat3d_rotate(HomMat3DIdentity, Theta, 'z', 0,0,0, HomMat3DRotate) affine_trans_object_model_3d(ArrowModel, HomMat3DRotate, ArrowModelRotated) * 合并点云模型(替换成你的点云对象名)和箭头模型 concat_object_model_3d([PointCloudModel, ArrowModelRotated], CombinedModel) * 一起渲染,箭头用红色区分 render_object_model_3d(WindowHandle, CombinedModel, CamParam, Pose, ['color'], ['red'])
2. 用disp_arrow_3d()直接绘制(Halcon版本支持的话)
如果你的Halcon版本有这个函数,直接用它在3D窗口里画小型箭头,指定起点、终点、大小就行,不用折腾模型合并。
示例代码:
* 假设已算出点云中心CenterX/CenterY/CenterZ,以及绕Z轴的旋转角Theta DirX := cos(Theta) DirY := sin(Theta) DirZ := 0 * 设置箭头起点(点云中心附近)和终点(缩放因子0.2控制大小) StartX := CenterX StartY := CenterY StartZ := CenterZ EndX := StartX + DirX * 0.2 EndY := StartY + DirY * 0.2 EndZ := StartZ + DirZ * 0.2 * 绘制小型3D箭头,最后一个参数控制箭头头部大小 disp_arrow_3d(WindowHandle, StartX, StartY, StartZ, EndX, EndY, EndZ, 'red', 0.05)
3. 改进2D箭头的绘制方式(如果非要用2D)
别用add_image(),改成先生成旋转后的箭头XLD,再把XLD绘制到点云渲染后的图像上,这样能精准控制箭头位置和样式,不会出现像素叠加的问题。
示例代码:
* 生成箭头轮廓XLD gen_arrow_contour_xld(ArrowXLD, 10,10, 50,10, 5,5) * 绕中心旋转箭头(Theta是点云的Z轴旋转角) hom_mat2d_identity(HomMat2DIdentity) hom_mat2d_rotate(HomMat2DIdentity, Theta, 30,30, HomMat2DRotate) affine_trans_contour_xld(ArrowXLD, ArrowXLDrot, HomMat2DRotate) * 把旋转后的箭头绘制到点云图像上 paint_xld(ArrowXLDrot, PointCloudImage, PointCloudImageWithArrow, 'red', 1)
内容的提问来源于stack exchange,提问作者Malinko
相关产品推荐
相关产品推荐

