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

目录

  • [一、find_box_3d 函数](#一、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之间的分数。分数表示盒子及其边缘的可见程度,以及找到的盒子与指定尺寸的匹配程度。

csharp 复制代码
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操作符提供的文档
    *如何准备数据的详细描述
    *故障排除。
csharp 复制代码
* ***************************************************************
* 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', [], [])
相关推荐
YashanDB1 小时前
【YashanDB知识库】YAS-05534 unsupport operation: Create sibling files to diskgroups
数据库·yashandb·崖山数据库
鱼大大博客2 小时前
Edge Scdn的应用场景有哪些?
前端·edge
两只鱼丿2 小时前
Edge安装问题,安装后出现:Could not find Edge installation
前端·edge
西瓜味儿的小志3 小时前
Redis的大key和热key问题
数据库·redis·缓存·中间件
screct_demo5 小时前
通俗易懂的讲一下Vue的双向绑定和React的单向绑定
前端·javascript·html
有心还是可以做到的嘛5 小时前
ref() 和 reactive() 区别
前端·javascript·vue.js
练小杰6 小时前
我在广州学 Mysql 系列——有关数据表的插入、更新与删除相关练习
android·运维·数据库·经验分享·学习·mysql·adb
silence2507 小时前
oracle基础:将字段从 VARCHAR 修改为 CLOB
数据库·oracle
xcLeigh8 小时前
HTML5实现好看的博客网站、通用大作业网页模板源码
前端·课程设计·html5
mit6.8248 小时前
[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider
前端·qt·学习·ubuntu