一、记录一些Halcon里的关于3D的算子
1.read_object_model_3d 从文件读取一个3d模型
如下图,读的一个ply文件出来是个3d点云模型
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模型
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作为变换参数
如下图,做了变换
变换后,原点位置,姿态都变了
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个点,越小点越少
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测试代码:
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)