一. 重要算子解析
- read_object_model_3d ( : : FileName, Scale, GenParamName, GenParamValue : ObjectModel3D, Status) —
读取3D点云模型
参数:
FileName(in):要读取的文件的文件名。
Scale(in):文件中数据的比例,包括‘m’, ‘cm’, ‘mm’, ‘um’, ‘nm’
等。
GenParamName(in):参数名称。
GenParamValue (in):参数名称对应的值。
ObjectModel3D(out) :3D对象模型的句柄。
Status(out) :状态信息。
- select_points_object_model_3d ( : : ObjectModel3D, Attrib, MinValue, MaxValue : ObjectModel3DThresholded) —
筛选孤立散点的特征值(点的x y z坐标,法向量x y z)针对点的特诊的筛选
参数:
ObjectModel3D(in):输入点云模型句柄。
Attrib(in):被筛选点的属性特征(包括点的X/Y/Z
坐标,法向量的X/Y/Z
坐标等特征)。
MinValue(in):被筛选点的属性特征最小值。
MaxValue (in):被筛选点的属性特征最大值。
ObjectModel3DThresholded(out) :处理之后的3D对象模型的句柄。
注:类似二维平面处理中用于筛选面积、长度、宽度等灰度特征的算子select_obj(Operator)
- select_object_model_3d ( : : ObjectModel3D, Feature, Operation, MinValue, MaxValue : ObjectModel3DSelected) —
筛选点云连通集合的特征
参数:
ObjectModel3D(in):输入点云模型句柄。
Feature(in):特征名称。
Operation(in):特征之间的关系。
MinValue(in):特征之间的最小值。
MaxValue (in):特征之间的最大值。
ObjectModel3DSelected(out) :处理之后的3D对象模型的句柄。
- triangulate_object_model_3d ( : : ObjectModel3D, Method, GenParamName, GenParamValue : TriangulatedObjectModel3D, Information) —
三角网格曲面重建(点集→曲面)
参数:
ObjectModel3D(in): 3D对象模型的句柄。
Method(in):曲面重建所使用的方法。
GenParamName(in):参数名称。
GenParamValue (in):参数名称对应的值。
TriangulatedObjectModel3D(out) :网格曲面重建之后的句柄。
Information(out) :状态信息。
- visualize_object_model_3d ( : : WindowHandle, ObjectModel3D, CamParam, PoseIn, GenParamName, GenParamValue, Title, Label, Information : PoseOut) —
显示3D点云数据
参数:
WindowHandle(in):窗口句柄指针。
ObjectModel3D(in):3D模型的句柄。
CamParam(in):相机内参(与相机自身特性相关的参数,比如相机的焦距、像素大小等)。
PoseIn (in):相机外参(在世界坐标系中的参数,比如相机的位置、旋转方向等,一般是3个平移+3个旋转),即选择以什么样的姿态去显示该模型。一般默认空[],会以一种默认姿态去显示3D
模型。
*GenParamName(in) :参数名称,例如:'color'(设置模型显示颜色)
、'disp_pose'(是否显示世界坐标系)
、'disp_normals'(是否显示法向量)
、'normal_color'(法向量显示颜色)
、'lut'(颜色表)
、'color_attrib'(颜色属性:对哪个方向颜色递进)
等。
*GenParamValue(in) :参数名称对应的值,常用:['lut','color_attrib','disp_pose']
,['color1','coord_z','true']
。
Title(in) :现实的文字,将显示在输出图形窗口左上角的文本。
Label(in) :将显示在每个显示对象模型位置的文本。
Information (in) :将显示在输出图形窗口左下角的文本。
PoseOut(out) :用户可能以交互式更改的所有对象模型的姿势。
- write_object_model_3d ( : : ObjectModel3D, FileType, FileName, GenParamName, GenParamValue : ) —
保存3D点云数据
参数:
ObjectModel3D(in):3D模型的句柄。
FileType(in):写入的文件的类型。
FileName(in):写入的文件的名称。
GenParamName(in):参数名称。
GenParamValue (in) :参数名称对应的值。
注:
1、visualize_object_model_3d
算子是阻塞式的,需要点击窗口右下角的Continue
按钮才可执行下一步操作,可通过更改内部封装的算子去掉Continue按钮。
2、参数CamParam、PoseIn、GenParamName、GenParamValue
,可通过disp_object_model_3d
算子完成设置。
二. 相关示例展示
1、点云求电池高度
* 1.读入点云数据(文件中) read_object_model_3d ('./2020-01-10-235331.om3', 'm', [], [], ObjectModel3D, Status) dev_open_window (0, 0, 512, 512, 'black', WindowHandle) * 可视化显示三维点云模型 visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut) * 2.得到电池表面点云的数据集合(mm) get_object_model_3d_params (ObjectModel3D, 'point_coord_z', GenParamValue) * 去掉不在电池表面的干扰噪点(针对点的特征进行筛选) select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 15, 16, ObjectModel3DThresholded) visualize_object_model_3d (WindowHandle, ObjectModel3DThresholded, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut1) * 点云连通集合断开(点点间距不超过1mm的点当做一个连通域点集) connection_object_model_3d (ObjectModel3DThresholded, 'distance_3d', 1, ObjectModel3DConnected) get_object_model_3d_params (ObjectModel3DConnected, 'num_points', GenParamValue1) * 去掉其他散点组成的连通域,获取电池表面点集连通域(针对点云连通集合之间的特征进行筛选) select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 1000, 50000, ObjectModel3DBattery) visualize_object_model_3d (WindowHandle, ObjectModel3DBattery, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut1) * 3.得到背景的点云数据集合(mm) select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 12, 14, ObjectModel3DBackGround) visualize_object_model_3d (WindowHandle, ObjectModel3DBackGround, [], PoseOut1, ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], [], [], [], PoseOut2) * 4.求电池上表面点云的z坐标值 get_object_model_3d_params (ObjectModel3DBattery, 'point_coord_z', GenParamValue1) * 5.求背景表面的点云的z坐标值 get_object_model_3d_params (ObjectModel3DBackGround, 'point_coord_z', GenParamValue2) * 6.求电池上表面点云A和背景表面点云B的z坐标的平均值 A:=mean(GenParamValue1) B:=mean(GenParamValue2) * 7.求电池表面的高度 H:=A-B Param[0]:='Shift+left button Zoom' Param[1]:='ctrl+ left button Move' Param[2]:='left button Rotat' visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['lut','color_attrib','disp_pose'], ['color1','coord_z','true'], '电池点云的高度为'+H+'mm', 'Battery Object', Param, PoseOut)
结果图如下所示(Halcon
默认红色代码X
轴、绿色代表Y
轴、蓝色代表Z
轴):
通过计算电池表面的点云Z
坐标集合平均值和和背景表面的点云Z
坐标集合平均值作差,最终计算结果为2.94mm
,标准高度在3mm
左右,误差在0.1mm
左右.
halcon
仿真代码以及点云模型分享链接: https://pan.baidu.com/s/1YjXlMva_duZb2tBUj1ga5A 提取码:et5w
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |