当前位置:   article > 正文

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

visualize_object_model_3d

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
2.2.3. Z方向平移

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

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/109032
推荐阅读
相关标签
  

闽ICP备14008679号