一、文章简介
文章介绍的是halcon 3D点云数据blob分析的基础步骤,需要处理的点云数据如图一所示:
二、3D图像Blob分析的基本步骤
1、读取点云模型
** 读取点云数据
read_object_model_3d ('白板笔', 'm', [], [], ObjectModel3D, Status)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
2、去掉离散点数据(处理结果如图二所示):
** 去掉离散点数据
smooth_object_model_3d (ObjectModel3D, 'mls', [], [], SmoothObjectModel3D)
visualize_object_model_3d (WindowHandle, SmoothObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
3、按照点距筛选(将白板笔的大概区域找出来,处理结果如图三所示):
** 筛选需要数据
get_object_model_3d_params (SmoothObjectModel3D, 'point_coord_z', ZValues)
** 求取Z轴上点云坐标的范围值
ZMin :=min(ZValues)
ZMax :=max(ZValues)
** 按照坐标进行筛选
select_points_object_model_3d (SmoothObjectModel3D, 'point_coord_z', 76, 80, ObjectModel3DThresholded)
visualize_object_model_3d (WindowHandle, ObjectModel3DThresholded, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
4、进行去噪操作(找出主要的焦点区域,处理结果如图四所示):
** 去噪
connection_object_model_3d (ObjectModel3DThresholded, 'distance_3d', 0.5, ObjectModel3DConnected)
** 获取当前拆分的每个点云区域的点的数量
get_object_model_3d_params (ObjectModel3DConnected, 'num_points', PointsValue)
PointsMax :=max(PointsValue)
** 按照点云数量获取目标点云区域
select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 200000, 220000, ObjectModel3DSelected)
5、点云简化并进行点云的采样(处理结果如图五所示):
** 点云采样
sample_object_model_3d (ObjectModel3DSelected, 'accurate', 0.8, [], [], SampledObjectModel3D)
visualize_object_model_3d (WindowHandle, SampledObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
6、调整主轴的位置,一般三个主轴的原点放到点云数据的质心上面(处理截图如图六,求取的质心数据如图七所示):
** 坐标放到点云数据质心上
moments_object_model_3d (SampledObjectModel3D, 'principal_axes', Moments)
** 位姿反转
pose_invert (Moments, PoseInvert)
** 把位姿转换为旋转+平移矩阵
pose_to_hom_mat3d (PoseInvert, HomMat3D)
** 仿射变换位置
affine_trans_object_model_3d (SampledObjectModel3D, HomMat3D, ObjectModel3DAffineTrans)
7、处理为光面(做三角化处理,处理结果如图八所示):
** 转换为光面
triangulate_object_model_3d (ObjectModel3DAffineTrans, 'greedy', [], [], TriangulatedObjectModel3D, Information)
visualize_object_model_3d (WindowHandle, TriangulatedObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
以上的七个步骤就是3D图像Blob分析的基本步骤。
三、代码流程如下所示:
dev_close_window ()
dev_open_window (0, 0, 500, 400, 'black', WindowHandle)
GenParamName :=['lut', 'color_attrib','disp_pose']
GenParamValue :=['color1','coord_z','true']
** 读取点云数据
read_object_model_3d ('白板笔', 'm', [], [], ObjectModel3D, Status)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
** 去掉离散点数据
smooth_object_model_3d (ObjectModel3D, 'mls', [], [], SmoothObjectModel3D)
visualize_object_model_3d (WindowHandle, SmoothObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
** 筛选需要数据
get_object_model_3d_params (SmoothObjectModel3D, 'point_coord_z', ZValues)
** 求取Z轴上点云坐标的范围值
ZMin :=min(ZValues)
ZMax :=max(ZValues)
** 按照坐标进行筛选
select_points_object_model_3d (SmoothObjectModel3D, 'point_coord_z', 76, 80, ObjectModel3DThresholded)
visualize_object_model_3d (WindowHandle, ObjectModel3DThresholded, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
** 去噪
connection_object_model_3d (ObjectModel3DThresholded, 'distance_3d', 0.5, ObjectModel3DConnected)
** 获取当前拆分的每个点云区域的点的数量
get_object_model_3d_params (ObjectModel3DConnected, 'num_points', PointsValue)
PointsMax :=max(PointsValue)
** 按照点云数量获取目标点云区域
select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 200000, 220000, ObjectModel3DSelected)
visualize_object_model_3d (WindowHandle, ObjectModel3DSelected, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
** 点云采样
sample_object_model_3d (ObjectModel3DSelected, 'accurate', 0.8, [], [], SampledObjectModel3D)
visualize_object_model_3d (WindowHandle, SampledObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
** 坐标放到点云数据质心上
moments_object_model_3d (SampledObjectModel3D, 'principal_axes', Moments)
** 位姿反转
pose_invert (Moments, PoseInvert)
** 把位姿转换为旋转+平移矩阵
pose_to_hom_mat3d (PoseInvert, HomMat3D)
** 仿射变换位置
affine_trans_object_model_3d (SampledObjectModel3D, HomMat3D, ObjectModel3DAffineTrans)
visualize_object_model_3d (WindowHandle, ObjectModel3DAffineTrans, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
** 求发线
* surface_normals_object_model_3d (ObjectModel3DAffineTrans, 'mls', [], [], ObjectModel3DNormals)
** 转换为光面
triangulate_object_model_3d (ObjectModel3DAffineTrans, 'greedy', [], [], TriangulatedObjectModel3D, Information)
visualize_object_model_3d (WindowHandle, TriangulatedObjectModel3D, [], [], GenParamName, GenParamValue \
, [], [], [], PoseOut)
附录:
程序点云数据网盘自取:
链接:https://pan.baidu.com/s/1EJRdTpcC3LtnYa_ghSS3Pw
提取码:wzlb