当前位置: 首页 > article >正文

halcon三维点云数据处理(六)find_box_3d

目录

  • 一、find_box_3d 函数
  • 二、find_box_3d 函数调用过程

首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。

一、find_box_3d 函数

find_box_3d在3D对象模型ObjectModel3DScene中查找盒子,并返回抓握点的姿势GrippingPose,一个3D对象模型ObjectModel3DBox一个分数值score和一个字典BoxInformation,其中包含关于每个找到的盒子的进一步信息。
盒子的边长在SideLen1、SideLen2和SideLen3中传递。每个长度由一个包含两个值的元组组成,表示该边的最小和最大长度。如果只期望盒子的一个面是可见的,或者不应该限制盒子的剩余长度,SideLen3=-1
首先,在GrippingPose中返回一个紧握点的姿势。根据xyz映射设置盒子的使用面和抓取姿势的z轴。如果只有盒子的一面是可见的,那么抓握姿势的中心就在那一面的中心,并且它的z轴方向远离xyz映射的观察点。如果盒子的多个侧面可见,则抓握姿势位于与xyz映射的观察点最平行的一侧的中心。z轴再次朝向远离xyz映射的观察点。
在ObjectModel3DBox中,该框也以三角化形式返回。这允许对结果进行快速可视化。
对于每个找到的框,在score中返回0到1之间的分数。分数表示盒子及其边缘的可见程度,以及找到的盒子与指定尺寸的匹配程度。

find_box_3d( : : ObjectModel3DScene, SideLen1, SideLen2, SideLen3, MinScore, GenParam : GrippingPose, Score, ObjectModel3DBox, BoxInformation)

results:这个键引用一个包含找到的框的字典。
它们根据它们的分数按降序排序,从0开始的升序整数键。
每个框的结果都是一个字典,包含以下关键字:box_pose:这是框在场景坐标系统中的姿态。
这个姿势用于可视化找到的盒子。
box_length_x, box_length_y, box_length_z:与box_pose对应的找到的盒子的边长。
Box_length_x和box_length_y总是包含一个正数。
如果只有盒子的一面是可见的,box_length_z将被设置为O.gripping_pose:与GrippingPose中返回的姿势相同。
gripping_length_x, gripping_length_y, gripping_length_z:找到的盒子对应于GrippingPose的边长。
Gripping_length_x和gripping_length_y总是包含一个正数。
如果只有盒子的一面是可见的,gripping_length_z将被设置为0。

score:与score中返回的分数相同。
one_side_only:布尔值,指示框的一侧是否可见(‘true‘)或不可见(’false ’)。
gen_param:这是一个字典,其中包含用于查找box 3d的参数。
SideLen1、SideLen2和SideLen3被池放在一个具有密钥长度的元组中。
关键的最小分数引用MinScore。
其他键的表示类似于字典Gen Param的通用参数。
sampled_edges:这是带有采样边缘的3D对象模型。
它包含作为法向量的边缘点的观察方向。
sampled_edges_direction:这是带有采样边缘的3D对象模型(与sampled_edges键相同)。
它包含作为法向量的边缘点的边缘方向。
sampled_scene:这是在其中寻找盒子的采样场景。
它可以用于可视化或调试采样距离。
sampled_reference_points:这是一个3D对象模型,其中来自3D场景的所有点在匹配过程中用作参考点。
对于每个参考点,在假设参考点位于箱体表面的情况下,计算箱体的最佳位姿。

二、find_box_3d 函数调用过程

这个例子展示了如何在3D场景中找到通用的盒子。
*首先,3D场景由带有的xyz图像生成

  • xyz_to_object_model_3d运算符。然后,用指定的方框
    *在3D场景中可以找到边长。
  • find_box_3d为每个找到的框返回一个GrippingPose
    *在调用find_box_3d指定的大小范围内。
    *这种抓握姿势可以提供给手眼校准
    *机器人抓取找到的盒子。请确保
  • GrippingPose和机器人使用相同的姿态类型(参见
  • create_pose)。

*在大多数应用场景中,3D场景必须是
*预处理,以便在a中找到通用框
*快速而健壮的方法。

  • find_box_3d操作符提供的文档
    *如何准备数据的详细描述
    *故障排除。
* ***************************************************************
* Example for the generic box finder using 3D data.
* 
* This example shows how to find generic boxes in a 3D scene.
* First, the 3D scene is generated from an XYZ-image with the
* operator xyz_to_object_model_3d. Then, the boxes with specified
* side lengths are found in the 3D scene.
* 
* find_box_3d returns a GrippingPose for each found box that is
* within the size range specified in the call to find_box_3d.
* This GrippingPose can be provided to a hand-eye calibrated
* robot to grip the found boxes. Please ensure that the
* GrippingPose and the robot use the same pose type (see
* create_pose).
* 
* In most application scenarios, the 3D scene has to be
* preprocessed in order to find generic boxes in a
* fast and robust way.
* The documentation of the operator find_box_3d provides
* detailed descriptions how to prepare your data or how to
* troubleshoot in case of problems.
* 
* The example demonstrates how to use the operators
*   xyz_to_object_model_3d,
*   find_box_3d,
*   and the procedure debug_find_box_3d.
* 
* ***************************************************************
dev_update_off ()
ImagePath := 'boxes/cardboard_boxes_'
* 
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
* 
* Prepare and display description.
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_disp_introduction ()
stop ()
* 
* Show the example image.
dev_clear_window ()
read_image (Image, ImagePath + '01')
dev_display (Image)
Message := 'This is an image of the example scene in which we want to find the boxes.'
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
RobotToolSize := 0.03
gen_robot_tool_and_base_object_model_3d (RobotToolSize * 0.05, RobotToolSize, OM3DToolOrigin, OM3DBase)
* 
Pose := []
for SceneIdx := 1 to 4 by 1
    * Read the image of the scene and create a 3D object model.
    read_image (ImageXYZ, ImagePath + 'xyz_' + SceneIdx$'02')
    decompose3 (ImageXYZ, X, Y, Z)
    xyz_to_object_model_3d (X, Y, Z, OM3DScene)
    * 
    * Set the minimum and maximum side lengths of the boxes in meter.
    Len1 := [0.099, 0.11]
    Len2 := [0.075, 0.085]
    Len3 := [0.045, 0.065]
    * Set box detection parameters.
    Params := dict{}
    Params.remove_outer_edges := 'true'
    Params.max_gap := 150
    * Find the boxes.
    find_box_3d (OM3DScene, Len1, Len2, Len3, 0.2, Params, GrippingPose, Score, OM3DBox, BoxInformation)
    * The procedure debug_find_box_3d can be used to debug the
    * results of find_box_3d.
*     debug_find_box_3d (OM3DBox, OM3DScene, BoxInformation, FindBox3DGenParam)
    * 
    * Visualize the found boxes and the gripping poses.
    GripTools := []
    Colors := []
    for Index := 0 to |Score| - 1 by 1
        rigid_trans_object_model_3d (OM3DToolOrigin, GrippingPose[7 * Index:7 * Index + 6], OM3DToolTransformed)
        GripTools := [GripTools,OM3DToolTransformed]
        * Determine color of the gripping point
        * coordinate system in RGB.
        Colors := [Colors,'red', 'green', 'blue']
    endfor
    * 
    OM3DSampledScene := BoxInformation.sampled_scene
    OM3DSampledEdges := BoxInformation.sampled_edges
    gen_visualization_title (BoxInformation, Title)
    * 
    Colors := [Colors,gen_tuple_const(|OM3DBox|,'green'),'yellow', 'gray']
    Labels := [gen_tuple_const(3 * |OM3DBox|,''),Score$'.2f','', '']
    visualize_object_model_3d (WindowHandle, [GripTools,OM3DBox,OM3DSampledEdges,OM3DSampledScene], [], Pose, ['color_' + [0:4 * |OM3DBox| + 2 - 1],'alpha_' + [3 * |OM3DBox|:4 * |OM3DBox| - 1]], [Colors,gen_tuple_const(|OM3DBox|,0.5)], Title, Labels, [], Pose)
endfor
dev_disp_text ('      End of program      ', 'window', 'bottom', 'right', 'black', [], [])

http://www.kler.cn/a/467555.html

相关文章:

  • STM32的LED点亮教程:使用HAL库与Proteus仿真
  • C++:位与运算符
  • Redis两种主要的持久化方式是什么?
  • Jetpack Compose 学习笔记(四)—— CompositionLocal 与主题
  • 小程序学习06——uniapp组件常规引入和easycom引入语法
  • redis源码系列--(四)--redis cluster
  • 无刷直流电机(BLDC)六步换向法
  • ARM 汇编基础总结
  • 语义搜索、语义数据搜索
  • 折叠手机市场出现崩塌迹象,三星做了努力,将推低价折叠手机
  • GO语言学习(一:背景与代码初始)
  • Nginx:SSL/TLS 配置
  • HTML5 动画效果:淡入淡出(Fade In/Out)详解
  • AI 热潮背后的沉重:解读 DeepMind 天才科学家 Felix Hill 的心声
  • WebGL 实践(一)开发环境搭建
  • Json与jsoncpp
  • 使用 Jupyter Notebook:安装与应用指南
  • 深度学习中的步数指的是什么
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的线上动物园售票系统设计
  • Python 基于 opencv 的人脸识别监控打卡系统(源码+部署)
  • RocketMQ消费者如何消费消息以及ack
  • 继承(3)
  • Xilinx Vivado环境下载bit后自动触发ILA采集
  • TradingView功能
  • Chain of Agents(COA):大型语言模型在长文本任务中的协作新范式
  • 【Go学习】-01-5-网络编程