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', [], [])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建基本的 Electron 应用项目的详细步骤

创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始,然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先,确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装: node -v…

「scipy、eeg」使用python scipy butter filtfilt 分解EEG数据为5个频带和滤波参数选择

使用scipy butter filtfilt 分解EEG数据和滤波参数选择 【目录】 EEG数据频带和滤波参数滤波类型及示例Pyhton 代码实现 一、EEG数据频带和滤波参数 二、滤波类型 低通滤波(lowpass)高通滤波(highpass)带通滤波(bandpass&…

网络传输层TCP协议

传输层TCP协议 1. TCP协议介绍 TCP(Transmission Control Protocol,传输控制协议)是一个要对数据的传输进行详细控制的传输层协议。 TCP 与 UDP 的不同,在于TCP是有连接、可靠、面向字节流的。具体来说,TCP设置了一大…

深度学习第三弹:python入门与线性表示代码

一、python入门 1.熟悉基础数据结构——整型数据,浮点型数据,列表,字典,字符串;了解列表及字典的切片,插入,删除操作。 list1 [1, 2, 3, 4, 5] for each in list1:print(each) print(list1[1…

【Linux】shell脚本编程

目录 概念: shell脚本的本质: shell脚本编程: shell变量: 变量的定义格式: 变量的分类 自定义变量: 环境变量: 命令变量与命令行参数: 预定义变量: shell中的…

Onedrive精神分裂怎么办(有变更却不同步)

Onedrive有时候会分裂,你在本地删除文件,并没有同步到云端,但是本地却显示同步成功。 比如删掉了一个目录,在本地看已经删掉,onedrive显示已同步,但是别的电脑并不会同步到这个删除操作,在网页版…

CSS——1.优缺点

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css&#xff1a;层叠样式表…

软件23种设计模式完整版[附Java版示例代码]

一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…

(2023|NIPS,LLaVA-Med,生物医学 VLM,GPT-4 生成自指导指令跟随数据集,数据对齐,指令调优)

LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 目录 LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 0. 摘要 1. 简介 2. 相关工作 3. 生物医学视觉指令数据 4. 将多模态对话模型适配…

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 与 SqlSession 正如其名&#xff0c;Sqlsession对应着一次数据库会话。由于数据库会话不是永久的&#xff0c;因此Sqlsession的生命周期也不应该是永久的&#xff0c;相反&#xff0c;在你每次访问数据库时都需要创建它&#xff08;当然并不是说在Sqlsession…

Numpy数组的属性

NumPy中最重要的一个特点就是其n维数组对象&#xff0c;即ndarray(别名array)对象&#xff0c;该对象具有矢量算术能力和复杂的广播能力&#xff0c;可以执行一些科学计算。不同于Python内置的数组类型&#xff0c; array对象拥有对高维数组的处理能力&#xff0c;这也是数值计…

(十)提示词任务分解的策略探讨

&#x1f4e2;&#x1f4e2;&#x1f4e2; 大家好&#xff0c;我是云楼Yunlord&#xff0c;CSDN博客之星人工智能领域前三名&#xff0c;多年人工智能学习工作经验&#xff0c;一位兴趣稀奇古怪的【人工智能领域博主】&#xff01;&#xff01;&#xff01;&#x1f61c;&#…

01 数据分析介绍及工具准备

数据分析介绍及工具准备 一、工具准备二、下载和使用Anaconda三、jupyter notebook常用快捷键 一、工具准备 数据科学库 NumPy&#xff0c;SciPy&#xff0c;Pandas&#xff0c;Scikit-Learn 数据可视化库 Matplotlib&#xff0c;Seaborn 编译器 Jupyter Notebook 数据科…

excel表格二维X、Y坐标散点图

excel中存在两列或两行数据&#xff0c;分别表示x坐标和对应的y坐标&#xff0c;同时选中两列或两行数据&#xff1a; 依次选择菜单&#xff0c;插入&#xff0c;图标&#xff0c;XY散点图 可以看到在表格中生成了以第1列为X轴&#xff0c;第2列为Y轴的二维XY散点图&#xff…

Cursor无限续杯——解决Too many free trials.

前情提要 我们都知道Cursor对新用户是有14天且500条免费限制的。 一般情况下&#xff0c;当14天过期&#xff0c;是可以注销账户再重新注册&#xff0c;这样就可以继续拥有14天的体验时长。 但是&#xff01;&#xff01;如果使用超过500次&#xff0c;Cusor就会把你的电脑I…

HCIE-day10-ISIS

ISIS ISIS&#xff08;Intermediate System-to-Intermediate System&#xff09;中间系统到中间系统&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff1b;是一种链路状态协议&#xff0c;使用最短路径优先SPF算法进行路由计算&#xff0c;与ospf协议有很多相…

洛谷P1617———数字转英文

题目如下 思路&#xff1a;将1~9的英文和20~90的英文用字符串数组存储&#xff0c;把下标看作对应的数字进行输出&#xff0c;遇到0或连续多个0就输出“and”&#xff0c;定义l用来看枚举到哪一位了&#xff0c;如果是单独输入一个“0”&#xff0c;则直接输出zero然后结束。否…

UnityRenderStreaming使用记录(五)

UnityRenderStreaming不一样的错误&#xff0c;船新的版本 继续docker部署UnityRenderStreamingdockerfile一些命令出现了新的错误先解决一个报错不知道怎么解决&#xff0c;先跑个glxgears测试一下先解决MESA和glx的问题新的log&#xff0c;额新的错误尝试解决libnvidia-encod…

Unity-Mirror网络框架-从入门到精通之AdditiveScenes 示例

文章目录 前言Additive Levels和Additive ScenesAdditive Levels场景介绍Portal传送门FadeInOut特效 Additive Scenes示例介绍ZoneHandlerSceneMassage 最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框…

Mac-docker配置

1.配置的文件路径 cd ~/.docker (base) zhangyaweimacbookair .docker % ls buildx cli-plugins config.json contexts daemon.json desktop-build mutagen run (base) zhangyaweimacbookair .docker % cat daemon.json## 重启docker服务 sudo systemctl daemon-reload sudo…