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

深度相机,通过2d检测得到目标坐标系的3d检测框

算法流程图如下
在这里插入图片描述

1. 输入同步

  • 订阅三个主题:
    • 深度图像 (depth_image)。
    • 相机信息 (depth_info)。
    • 2D目标检测 (detections)。
  • 使用 message_filters.ApproximateTimeSynchronizer 来同步这些输入,以确保处理的消息是对应的。

2. 计算2D边界框的中心位置和尺寸

  • 通过yolo模型获得每个目标的2D边界框。这些边界框由其中心点坐标 (center_x, center_y) 和尺寸 (size_x, size_y) 表示。
  • center_xcenter_y 表示2D边界框在图像平面中的中心点坐标,而 size_xsize_y 则分别表示边界框的宽度和高度。

3. 使用深度图像找到对应的深度(Z)值

  • 2D边界框的中心点对应图像中的一个像素点,通过深度图像可以获取该像素点的深度值(即Z值)。深度图像的每个像素值表示从相机到该点的距离,通常以毫米或米为单位。

4. 通过相机的内参将其转换为世界坐标系中的3D位置(X, Y, Z)

  • 相机内参矩阵 K 包含了相机的焦距(fxfy)以及主点坐标(光学中心)pxpy。相机内参矩阵的形式如下:
    K = [ fx   0  px0  fy  py0   0   1 ]
    
  • 根据针孔相机模型,图像中的2D点 (u, v) 和3D空间中的点 (X, Y, Z) 的关系可以表示为:
    X = Z * (u - px) / fx
    Y = Z * (v - py) / fy
    
  • 其中,Z 是从深度图像中获取的深度值,(u, v) 是图像中的像素坐标,即2D边界框的中心点坐标 (center_x, center_y)
  • 通过这个公式,计算出在3D空间中对应的 XY 坐标,这些坐标连同深度 Z 一起定义了2D边界框在世界坐标系中的3D位置 (X, Y, Z)

5. 计算3D边界框的尺寸

  • 在得到 Z 值之后,可以进一步计算3D边界框的宽度 W 和高度 H。这些值通过以下公式计算:
    W = Z * (size_x / fx)
    H = Z * (size_y / fy)
    
  • 这里的 size_xsize_y 是2D边界框的宽度和高度,fxfy 是相机的焦距,Z 代表的是2D边界框中心点的深度值。
  • 通过这些公式,可以将2D边界框的尺寸投影到3D空间,得到3D边界框的宽度和高度。

6. 生成3D边界框消息

  • 最终,代码将计算出的3D位置 (X, Y, Z) 和尺寸 (W, H, D) 组装成一个 BoundingBox3D 消息,该消息包含了3D边界框的中心位置和尺寸。

这整个过程将图像中的2D信息和深度图像中的距离信息结合起来,从而生成了目标在世界坐标系中的3D表示。

7. 发布结果

  • 最后,生成的3D检测结果(包括边界框和关键点),生成的3D边界框转换到目标坐标系(例如base_link)。这个方法通过应用平移旋转操作,将3D边界框对齐到指定的target_frame参数对应的坐标系中。

8. 坐标转换过程:

  1. 获取转换信息

    • 获取从当前坐标系到目标坐标系(例如base_link)的转换信息。这个信息包括:
      • 平移向量:描述如何将物体从一个坐标系移动到另一个坐标系的平移操作。
      • 旋转四元数:描述如何旋转物体以对齐到目标坐标系。
  2. 应用平移和旋转

    • 接受生成的3D边界框以及从get_transform`方法获得的平移和旋转信息。转换过程如下:

    a. 平移

    • 首先,对3D边界框的中心位置(x, y, z)应用平移操作。平移向量translation被加到3D边界框的中心位置坐标上,使得3D边界框的位置移动到目标坐标系。

    b. 旋转

    • 然后,使用旋转四元数rotation对3D边界框的中心位置和尺寸进行旋转。这个旋转会改变3D边界框的方向,使其对齐到目标坐标系的方向。

    具体过程:

    • 位置转换:通过qv_mult方法,旋转四元数与位置向量进行乘法运算,得到旋转后的位置,再加上平移向量,最终得到转换后的3D边界框中心位置。
    • 尺寸转换:同样的旋转操作也会应用到边界框的尺寸向量上,以确保3D边界框在新坐标系中的形状和方向正确。
  3. 更新坐标系信息

    • 最后,3D边界框的信息(如位置、尺寸)被更新为新坐标系中的数据,并且3D边界框的frame_id属性被设置为目标坐标系(target_frame,例如base_link)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 最佳 5 款 SD 卡照片恢复应用程序,用于从 SD 卡恢复已删除的照片
  • 分层神经网络(DNN)知多少?
  • Java--IO--字符流
  • 记录一个lombok和mybatisplus的问题,@Data注解失效
  • 《基层回忆录》第三章:进城
  • 数据结构初阶——算法复杂度超详解
  • VideoPlayer插件的用法
  • 富格林:活用阻挠欺诈套路计策
  • 从零开始搭建 EMQX 集群压测框架
  • linux:有关目录、链接文件的函数 Makefil、gdb的使用
  • Nature Medicine | 常规机器学习构建蛋白质组衰老时钟!对于数学基础不好的同学,好好思考一下这种研究模式如何借鉴?
  • 暨南大学2024年硕士研究生报考录取情况统计表
  • Java面试八股之简述消息队列P2P模型
  • 硬件面试经典 100 题(51~70 题)
  • Collection - LinkedList 源码解读
  • Android Studio:GIT提交项目到远程仓库
  • co.js - 让异步代码同步化
  • Java IO学习笔记一
  • MySQL用户中的%到底包不包括localhost?
  • python_bomb----数据类型总结
  • tweak 支持第三方库
  • Windows Containers 大冒险: 容器网络
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开源地图数据可视化库——mapnik
  • 前端js -- this指向总结。
  • 三栏布局总结
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 云大使推广中的常见热门问题
  • 自制字幕遮挡器
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 回归生活:清理微信公众号
  • ​虚拟化系列介绍(十)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $.each()与$(selector).each()
  • (1)(1.9) MSP (version 4.2)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (solr系列:一)使用tomcat部署solr服务
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)测试工具
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (九十四)函数和二维数组
  • (转)Linq学习笔记
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *** 2003
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net core Redis 使用有序集合实现延迟队列
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 连接达梦数据库开发环境部署
  • .Net 路由处理厉害了
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net打印*三角形
  • .net开发引用程序集提示没有强名称的解决办法