HALCON visualize_object_model_3d 算子原理的理解以及使用HSmartWindowControlWPF重实现

该文章介绍了在HALCON中如何利用特定算子进行点云渲染和鼠标交互操作,包括点云的旋转、XY平移和Z轴平移。通过WindowHandle和CamParam等参数控制点云显示,并详细阐述了鼠标交互的内部逻辑,如旋转和平移的数学计算过程。
摘要由CSDN通过智能技术生成

1. 参数说明

  1. WindowHandle:显示点云的窗口句柄
  2. ObjectModel3D:待显示的点云对象
  3. CamParam:相机内参
    1. 此处的相机指的是一个虚拟相机,为观察点云提供一个视角,如下图,点云在一个场景坐标系中(SCS),我们在WindowHandle中看到的点云效果就是通过此虚拟相机看到的点云
    2. 该值可以为空,如果为空,函数内部会根据窗口的width、height默认生成一组相机内参
      3d seene
  4. PoseIn:点云的初始位姿,按照指定的位姿显示点云,可以为空,为空是算子内部会自己计算一个初始位姿
  5. GenParamName、GenParamValue:设置渲染点云时的颜色、文字等参数,具体参考文档
  6. PoseOut:输出点云的当前位姿,被用户操作过的点云当前位姿

2. 算子原理

这个算子提供了我们最需要的两个核心功能:

  • 点云渲染
  • 鼠标交互:
    • 鼠标左键长按:控制点云旋转
    • 鼠标左键长按+Ctrl键:控制点云XY方向平移
    • 鼠标左键长按+Shift键:控制点云沿着Z轴平移,用户的感受为点云的放大和缩小
    • 鼠标右键单选某个点云:右键选定时,点云的透明度为降低,该点云被禁用,后续的鼠标交互操作对该点云没有作用
2.1. 点云渲染

渲染部分,使用的是3D Scene相关的算子,如display_scene_3d、具体可以参考帮助文档中的说明,HALCON已经封装的很好,也很容易理解

2.2. 鼠标交互

鼠标交互看起来比较复杂,主要由该算子内部analyze_graph_event算子实现,其解析鼠标事件,根据不同的鼠标事件类型做不同的处理,基本处理思路为:将鼠标的位置变化转换为点云的位姿变化

2.2.1. 点云旋转

鼠标移动,输入为鼠标的起始点和结束点(图像坐标系),最后输出一个旋转四元数:

  • 将起始点和结束点投影到virtual trackball上,得到三维空间的两个向量,project_point_on_trackball算子提供了Shoemake算法和Bell算法,具体原理可以参考文献
  • 两个向量的叉乘得到旋转轴,并计算出旋转角,
  • 使用axis_angle_to_quat算子计算出对应的四元数
  • 将四元数转为位姿旋转矩阵
  • 修改点云在场景坐标系中的位姿
  • 调用display_scene_3d刷新点云
2.2.2. XY平移

鼠标两个点(图像坐标系)的坐标反投影到Camera坐标系(使用了get_line_of_sight算子),计算在Camera坐标系中的两个点的XY方向的平移量,然后修改点云位姿中XY方向的值即可
简单用两个点测试一下:

dev_get_window (WindowHandle)
get_window_extents (WindowHandle, Row, Column, Width, Height)
gen_cam_par_area_scan_division (0.008, 0, 5.2e-006, 5.2e-006, Width*0.5, Height*0.5, Width, Height, CameraParam)

** 将图像坐标系中的点反向投影到相机坐标系中
get_line_of_sight (100, 120, CameraParam, PX, PY, PZ, QX1, QY1, QZ1)
get_line_of_sight (100, 220, CameraParam, PX, PY, PZ, QX2, QY2, QZ2)

** 将相机坐标系上的点投影到图像坐标系上
project_3d_point (QX1, QY1, QZ1, CameraParam, Row1, Column1)
***** Row1 = 100
***** Column1 = 120

** 手动验证,与project_3d_point结果一致
** u=x/dx + u(0)
** v=y/dy + v(0)
U_Col := QX1 / 5.2e-006 + Width*0.5 
V_Row := QY1 / 5.2e-006 + Height*0.5
** U_Col = 120
2.2.3. Z方向平移

鼠标在窗口中上Y方向的平移代表点云Z方向的平移量,同样只需更改点云位姿中Z方向的值即可

3. HSmartWindowControlWPF 实现点云渲染和鼠标交互

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值