Halcon中的一些3D算子

一、记录一些Halcon里的关于3D的算子

1.read_object_model_3d  从文件读取一个3d模型

如下图,读的一个ply文件出来是个3d点云模型

Halcon中的一些3D算子_第1张图片

Halcon中的一些3D算子_第2张图片

 2.visualize_object_model_3d  交互式展示3d模型

即上个算子读出来后,通过这个算子可以把3d模型显示出来旋转、平移,缩放来观察操作

算子签名

visualize_object_model_3d( : : WindowHandle, ObjectModel3D, CamParam, PoseIn, GenParamName, GenParamValue, Title, Label, Information : PoseOut)

WindowHandle:显示窗口句柄

ObjectModel3D:需要展示的3d模型

CamParam:假想的观察这个模型的一个面阵相机的内参

PoseIn:这个模型的3d姿态

GenParamName:参数名

GenParamValue:参数值

Title:展示在窗口左上角的文字

Label:在每个3d模型位置显示的文本

Information:窗口左下角显示的信息

PoseOut:用户调整模型姿态后输出这个3d姿态

其中参数名和参数值有很多,

举例 参数名color 参数值green    将模型颜色变为绿色

参数名 color_attrib 参数值coord_z 类似于z轴方向的渐变色ba

参数名 disp_pose 参数值 true  显示出坐标轴

3.connection_object_model_3d  分离3d模型中的各个连通域

算子签名

connection_object_model_3d( : : ObjectModel3D, Feature, Value : ObjectModel3DConnected)

可以通过调节distance_3d参数,把一些噪点分离出来

4.select_object_model_3d  根据全局特征从3d模型组中选取符合特征的3d模型们

算子签名

select_object_model_3d( : : ObjectModel3D, Feature, Operation, MinValue, MaxValue : ObjectModel3DSelected)

如可以设置参数'num_points'  模型点的数量,去除一部分点数少的模型,如噪点

5.union_object_model_3d 合并多个3d模型们成一个新的3d模型

算子签名

union_object_model_3d( : : ObjectModels3D, Method : UnionObjectModel3D)

3、4、5的操作可以用来去除噪点,如下图,去除噪点之后的3d模型

Halcon中的一些3D算子_第3张图片

 6.surface_normals_object_model_3d 计算3d模型的表面法线

算子签名

surface_normals_object_model_3d( : : ObjectModel3D, Method, GenParamName, GenParamValue : ObjectModel3DNormals)

这个算子计算模型表面法线。在3d点云匹配创建3d匹配模型的时候,需要模型带表面法线信息才可以用来创建。

7.max_diameter_object_model_3d 计算3d模型最大直径

8. create_pose 创建3D位姿

算子签名:

create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)

这个算子有一些参数,主要是通过各方向平移和旋转得到一个新的3d位姿。后面一些参数控制平移旋转先后顺序还有绕哪个坐标系下的轴,详细可查对应算子说明。

9.rigid_trans_object_model_3d 将刚性三维变换应用于这个3d模型

可以用这个算子对某个模型进行刚性变换、即平移和旋转。可以用上个算子的pose作为变换参数

如下图,做了变换

Halcon中的一些3D算子_第4张图片

 变换后,原点位置,姿态都变了

Halcon中的一些3D算子_第5张图片

10.sample_object_model_3d  对3d模型进行采样

算子签名

sample_object_model_3d( : : ObjectModel3D, Method, SampleDistance, GenParamName, GenParamValue : SampledObjectModel3D)

SampleDistance:这个采样距离,隔多少距离采集一个点,可以先求出3d模型的最大直径乘以一个比例系数来得到这个采样距离,如Diameter*0.003 最大直径的0.003倍,及最大直径上取333个采样点,乘的系数越小,点越多。

11.create_surface_model 创建一个用于基于曲面3d匹配的数据结构

算子签名

create_surface_model( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID)

RelSamplingDistance:这里的相对采样距离跟上面那个采样距离不一样,填0.05即取总点数乘以0.05个点,越小点越少

Halcon中的一些3D算子_第6张图片

 12.find_surface_model 在3d场景中找到模型的最佳匹配

算子签名:

find_surface_model( : : SurfaceModelID, ObjectModel3D, RelSamplingDistance, KeyPointFraction, MinScore, ReturnResultHandle, GenParamName, GenParamValue : Pose, Score, SurfaceMatchingResultID)

挺多参数,不一一写了

13.refine_surface_model_pose 优化三维场景中曲面模型的姿势

上一步算出来的姿态可以再给进这个算子优化一下

14.pose_invert 反转姿态

这样上面find的姿态,是预先做的模型通过变换匹配到场景中的位置,反转这个姿态,可以将场景变换回模型的位置,用于后期分析处理

用rigid_trans_object_model_3d变换后,和之前创建的3d模型匹配上了,如下图显示

Halcon中的一些3D算子_第7张图片

二、halcon测试代码:

dev_close_window ()
dev_open_window (0, 0, 1200, 800, 'black', WindowHandle)
*读取单帧点云ply文件
read_object_model_3d('D:/项目/tray盘/230425-汇川-tray盘/3d导出.ply', 'mm', [], [], ObjectModel3D, Status)




Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom:   Shift + left button'
Instructions[2] := 'Move:   Ctrl  + left button'

Message := 'Hik3D PointCloud'
*虚拟化模型并且显示
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['color','color_attrib','disp_pose'], ['green','coord_z','true'], Message, [], Instructions, PoseOut)
dev_clear_window ()

connection_object_model_3d (ObjectModel3D, 'distance_3d', 0.001, ObjectModel3DConnected)

select_object_model_3d (ObjectModel3DConnected, 'num_points', 'and', 2000, 1e30, ObjectModel3DSelected)

union_object_model_3d (ObjectModel3DSelected, 'points_surface', UnionObjectModel3D)


visualize_object_model_3d (WindowHandle, UnionObjectModel3D, [], [], ['color','color_attrib','disp_pose'], ['green','coord_z','true'], Message, [], Instructions, PoseOut)

dev_clear_window ()
surface_normals_object_model_3d (UnionObjectModel3D, 'mls', [], [], ObjectModel3DNormals)


max_diameter_object_model_3d (ObjectModel3DNormals, Diameter)

create_pose (0.13, 0.13, 0.028, 0, 0,180, 'Rp+T', 'gba', 'point', Pose4)
rigid_trans_object_model_3d (ObjectModel3DNormals, Pose4, ObjectModel3DRigidTrans1)

sample_object_model_3d (ObjectModel3DRigidTrans1, 'fast',Diameter*0.003, [], [], SampledObjectModel3D)



visualize_object_model_3d (WindowHandle, SampledObjectModel3D, [], [], ['color','color_attrib','disp_pose'], ['green','coord_z','true'], Message, [], Instructions, PoseOut)
dev_clear_window ()
create_surface_model (ObjectModel3DRigidTrans1, 0.01, [], [], SurfaceModelID)


read_object_model_3d ('D:/项目/tray盘/230425-汇川-tray盘/带围挡/1-3d导出', 'mm', 'convert_to_triangles', 'true', ObjectModel3D1, Status1)


sample_object_model_3d (ObjectModel3D1, 'fast', Diameter*0.01, [], [], SampledObjectModel3D1)

find_surface_model (SurfaceModelID, SampledObjectModel3D1, 0.02, 0.2, 0, 'false', [], [], Pose, Score, SurfaceMatchingResultID)

refine_surface_model_pose (SurfaceModelID, SampledObjectModel3D1, Pose, 0, 'false', [], [], Pose1, Score1, SurfaceMatchingResultID1)


pose_invert (Pose1, PoseInvert)

rigid_trans_object_model_3d (SampledObjectModel3D1, PoseInvert, ObjectModel3DRigidTrans)
dev_clear_window ()

create_pose (-0.05, -0.06, 10, 134, 340, 235, 'Rp+T', 'gba', 'point', Pose2)

create_pose (-0.05+Pose1[0], -0.06+Pose1[1], 10+Pose1[2], 134+Pose1[3], 340+Pose1[4], 235+Pose1[5], 'Rp+T', 'gba', 'point', Pose3)



visualize_object_model_3d (WindowHandle, [ObjectModel3DRigidTrans,ObjectModel3DRigidTrans1], [], Pose2, ['color_0','color_1','disp_pose'], ['gray','green','true'], [], [], [], PoseOut1)

dev_clear_window ()
visualize_object_model_3d (WindowHandle, [ObjectModel3D1,ObjectModel3DRigidTrans1], [], [Pose3,Pose2], ['alpha','color_0','color_1','disp_pose'], [0.5,'yellow','green','true'], [], [], [], PoseOut1)

你可能感兴趣的:(图像处理,3d,halcon,点云,3d匹配)