DeepStream 3D 深度相机应用#

deepstream-3d-depth-camera 示例应用程序位于 app/sample_apps/deepstream-3d-depth-camera,供您参考。此示例演示了两个不同的 pipeline,它们将深度相机从 2D 带入 3D 世界。深度和颜色数据捕获组件由 Intel® RealSense 深度相机 D435 系列生成。有关更多详细信息,请参阅 https://www.intelrealsense.com/depth-camera-d435/

先决条件#

您必须安装以下开发包

  • GStreamer-1.0

  • GStreamer-1.0 基础插件

  • GStreamer-1.0 gstrtspserver

  • X11 客户端库

  • libyaml-cpp-dev

  • RealSense SDK

  1. 要安装这些软件包,请执行以下命令

    sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \
    libgstrtspserver-1.0-dev libx11-dev libyaml-cpp-dev
    
  2. 按照 RealSense SDK 文档添加 RealSense 公钥和存储库列表。对于 x86,请参考 IntelRealSense/librealsense。对于 Jetson 平台,请参考 IntelRealSense/librealsense。您可以将 Ubuntu 20.04 源路径添加到 apt-repository 以安装依赖项。

    sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo bionic main" -u
    
  3. 然后安装 librealsense2 包以构建和测试。

    sudo apt-get install librealsense2-utils librealsense2-dev
    

    确保 RealSense SDK 版本不早于 2.48。

  4. 插入 Intel RealSense 深度 D400 系列 USB 相机。要验证相机并升级固件,请运行 realsense-viewer 并从 UI 更新。导航到文件夹 sources/apps/sample_apps/deepstream-3d-depth-camera

  5. 如果您在 deepstream 容器内运行这些命令,请确保相机设备已挂载在 docker run 命令中。例如

    docker run --rm -it --gpus '"device=0"' --device /dev/video0 --device /dev/video1 --device /dev/video2 ...
    
  6. DISPLAY 环境变量导出到正确的显示。例如,export DISPLAY=:0.0

深度颜色捕获到 2D 渲染 Pipeline 概述#

这是从深度捕获到基于 2D 的 depthmap 再到使用用户配置的线性颜色直接渲染的第一个 pipeline。

DeepStream Depth Camera for 2D rendering stack overview

该 pipeline 由 ds_3d_realsense_depth_capture_render.yaml 设置。它有两个组件,用于深度/颜色的 ds3d::dataloader 和用于 GLES 2D 渲染的 datarender

  • ds3d::dataloader 加载自定义库 libnvds_3d_dataloader_realsense.so,并通过 createRealsenseDataloader 函数创建 RealSense dataloader。此特定加载器配置为输出 [color, depth] 流。Gst-appsrcdataloader 连接到 deepstream pipeline。

    name: realsense_dataloader
    type: ds3d::dataloader
    out_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_dataloader_realsense.so
    custom_create_function: createRealsenseDataloader
    
  • ds3d::datarender 加载自定义库 libnvds_3d_gl_datarender.so,并通过 createDepthStreamDataRender 函数创建 GLES 渲染器。此特定加载器配置为 2D 深度和彩色图像。Gst-appsinkdatarender 连接到 deepstream pipeline。

    name: depth-render
    type: ds3d::datarender
    in_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_gl_datarender.so
    custom_create_function: createDepthStreamDataRender
    
  • realsense_dataloaderds3d/datamap 中捕获颜色和深度流,然后将数据传递到 ds3d::datarender 组件 depth-render

深度颜色捕获到 3D 点云处理和渲染#

第二个 pipeline 是从深度捕获、3D 点云处理和对齐,到带颜色的 3D 点云渲染。

DeepStream Depth Camera for 3D point cloud processing overview

第二个 pipeline 由 ds_3d_realsense_depth_to_point_cloud.yaml 设置。它有 3 个组件:用于深度/颜色捕获的 ds3d::dataloader,用于深度到点云处理的 ds3d::datafilter,以及用于 GLES 3D 点渲染的 datarender

  • ds3d::dataloader 与第一个 pipeline 相同,用于深度和颜色捕获。它还输出颜色/深度传感器的内部参数,以及从深度到颜色传感器模块的外部参数。

    name: realsense_dataloader
    type: ds3d::dataloader
    out_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_dataloader_realsense.so
    custom_create_function: createRealsenseDataloader
    
  • ds3d::datafilter 加载自定义库 libnvds_3d_depth2point_datafilter.so,并通过 createDepth2PointFilter 函数创建深度到 3D 点处理过滤器。此特定过滤器从深度生成 3D 点云数据集,并计算 UV 坐标图,用于点和颜色位置之间的对应关系。它需要来自 dataloader 的传感器内部和外部数据来进行对齐。

    name: point2cloud_datafilter
    type: ds3d::datafilter
    in_caps: ds3d/datamap
    out_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_depth2point_datafilter.so
    custom_create_function: createDepth2PointFilter
    

    ds3d::datafilternvds3dfilter Gst-plugin 加载,它接受 sink_caps 作为 in_caps,并接受 src_caps 作为 out_caps。它创建一个自定义的 ds3d::datafilter 实例,并将数据处理为 ds3d/datamap

  • ds3d::datarender 加载自定义库 libnvds_3d_gl_datarender.so,并通过 createPointCloudDataRender 函数创建 GLES 渲染器。此特定加载器配置用于 3D 点和颜色渲染。它还支持基于鼠标拖动的 3D 场景旋转。

    name: point-render
    type: ds3d::datarender
    in_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_gl_datarender.so
    custom_create_function: createPointCloudDataRender
    
  • realsense_dataloaderds3d/datamap 中捕获颜色和深度流以及传感器的内部和外部参数。然后,它将数据传递到下一个组件 point2cloud_datafilter。此组件生成 3D 点云数据和 UV 坐标映射到新的输出数据 ds3d/datamap。最后,数据被传递到 ds3d::datarender 组件 point-render 以进行 3D 渲染。

在配置文件中,in_capsout_caps 对应于 Gstreamer 的 sink_capssrc_caps

入门#

运行 RealSense 相机进行深度捕获和 2D 渲染示例#

  1. 运行深度捕获 2D 渲染 pipeline

    $ deepstream-3d-depth-camera -c ds_3d_realsense_depth_capture_render.yaml
    
  2. 这将设置一个 realsense dataloader

name: realsense_dataloader
type: ds3d::dataloader
out_caps: ds3d/datamap
custom_lib_path: libnvds_3d_dataloader_realsense.so
custom_create_function: createRealsenseDataloader
  1. 然后,它将 ds3d/datamap 流式传输到最终渲染组件:depth-render

name: depth-render
type: ds3d::datarender
in_caps: ds3d/datamap
custom_lib_path: libnvds_3d_gl_datarender.so
custom_create_function: createDepthStreamDataRender
  1. depth-render 自定义库应在同一窗口中同时显示深度数据和颜色数据。更新 min_depth/max_depth 以移除深度渲染中的前景和背景对象。根据 RealSense 规范,D435 相机的深度范围在 0.33 米之间。

min_depth: 0.3 # in meters
max_depth: 2.0 # in meters
  1. 更新 min_depth_color/min_depth_color [R, G, B] 值以可视化深度的颜色图。

     min_depth_color: [255, 128, 0] # RGB color value for mininum depth
     max_depth_color: [0, 128, 255] # RGB color value for maximum depth

The other colors are linearly interpolated between ``min_depth_color`` and ``max_depth_color``

运行 3D 深度捕获、点云过滤器和 3D 点渲染示例#

  1. 运行深度捕获和 3D 处理 pipeline

$ deepstream-3d-depth-camera -c ds_3d_realsense_depth_to_point_cloud.yaml
  1. 这将设置一个 realsense dataloader(与 2D 深度相同)。然后,它将 ds3d/datamap 流式传输到下游 datafilter 组件 point2cloud_datafilter

    name: realsense_dataloader
    type: ds3d::dataloader
    out_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_dataloader_realsense.so
    custom_create_function: createRealsenseDataloader
    
  2. 它将 ds3d/datamap 流式传输到 nvds3dfilter Gst-plugin,后者加载 point2cloud_datafilter 以将 2D 深度转换为 3D 点。有关 nvds3dfilter Gst-plugin 的更多详细信息,请参阅 Gst-nvds3dfilter

    name: point2cloud_datafilter
    type: ds3d::datafilter
    in_caps: ds3d/datamap
    out_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_depth2point_datafilter.so
    custom_create_function: createDepth2PointFilter
    
  3. 最后,ds3d/datamap 作为数据流被传递到渲染组件 point-render

    name: point-render
    type: ds3d::datarender
    in_caps: ds3d/datamap
    custom_lib_path: libnvds_3d_gl_datarender.so
    custom_create_function: createPointCloudDataRender
    
  • view_* 字段是视图位置的眼睛,类似于 OpenGL gluLookAt()

    view_position: [0, 0, -1] # view position in xyz coordinates
    view_target: [0, 0, 1] # view target which is the direction pointing to
    view_up: [0, -1.0, 0] # view up direction
    
  • near/far/fov 字段是眼睛的透视范围,类似于 OpenGL gluPerspective()

    near: 0.01 # nearest points of perspective
    far: 10.0 # farmost points of perspective
    fov: 40.0 # FOV of perspective
    

DeepStream 3D 深度相机应用配置规范#

deepstream-3d-depth-camera [ds3d::userapp] 组设置#

下表演示了 ds_3d_realsense_depth_to_point_cloud.yaml 的组设置示例。

3D 深度相机应用用户调试支持的设置#

属性

含义

类型和范围

示例

type

指定类型 ds3d::userapp

用于用户调试的组件类型

必须是 type: ds3d::userapp

name

指示用户定义的组件名称

字符串

name: debugdump

enable_debug

指示是否启用调试日志

布尔值

enable_debug: False

dump_depth

指示转储深度原始数据的文件位置

字符串

dump_depth: depth_uint16_640x480.bin

dump_color

指示转储颜色原始数据的文件位置

字符串

dump_color: color_rgba_1920x1080.bin

dump_points

指示转储 3D 点原始数据的文件位置。数据类型为 Float 和 XYZ 打包

字符串

dump_points: pointxyz.bin

DS3D 自定义组件配置规范#

有关更多详细信息,请参阅 DS_3D 支持的自定义组件规范 部分,位于 DeepStream-3D 自定义应用和库教程 中。

从源代码构建应用程序#

  1. 转到文件夹 sources/apps/sample_apps/deepstream-3d-depth-camera

  2. 运行以下命令

    $ Set CUDA_VER in the MakeFile as per platform.
    For both Jetson & x86, CUDA_VER=12.2
    $ make
    $ make install
    

注意

查看源代码以了解有关如何通过 Gst-appsrcGst-appsink 加载 dataloader/datarender 的更多详细信息。datafilternvds3dfilter Gst-plugin 加载。