ProjectPoints 映射像素点

ProjectPoints 算子用于将 rgb 图像中 2D 像素点 (ImagePoints 数据格式)转换为 3D 空间点( Pose 格式)。

type 功能
General 根据输入的点云图将2D像素点推理转换为 3D 点
Fast 根据输入的深度图将 2D 像素点推理转换为 3D 点, 相比于 General 模式处理速度提升十倍以上

General

算子参数

  • 像素映射半径/pixel_project_radius:由于点云成像受干扰可能存在缺失, 目标 2D 像素点可能没有对应的 3D 点云。此时算子会在该 2D 像素点周边 pixel_project_radius 的像素半径区域内查找所有具有对应 3D 点的像素点,将距离目标像素点最近的像素点对应的3D点作为映射结果。

  • 相机坐标/camera_pose:同输入端口的 camera_pose 作用一致。当输入端口 camera_pose 没有连接时,则必须给该 camera_pose 参数赋值。当输入端口camera_pose 有连接时,则在执行算子后会自动将输入端口的数值覆盖该 camera_pose 参数的值。

  • 相机彩色图标定文件/color_calib_file:图漾相机 rgb 镜头的出厂标定参数文件所在的文件地址,作用同输入端口的 color_calib_info 一致。当输入端口 color_calib_info没有连接时,则必须给该参数赋值。当输入端口 color_calib_info 有连接时,则优先使用输入端口的数值。

  • 坐标列表/pose_list:设置 pose 列表在 3D 视图中的可视化属性。

    • icon_visOn 打开 pose 列表可视化。

    • icon_visOff 关闭 pose 列表可视化。

    • icon_size设置 Pose 的尺寸大小。取值范围:[0.001~10]。默认值:0.1。

数据信号输入输出

输入:

  • cloud

    • 数据类型:PointCloud

    • 输入内容:掩码图的原图所对应的点云

  • camera_pose

    • 数据类型:Pose

    • 输入内容:“下述输入端口的像素点所在 RGB 图对应的 RGB 空间坐标系“ 到 “上述输入端口的点云所在的空间坐标系“ 的转换矩阵。如果上述输入端口的点云位于相机3D坐标系,则这里输入RGB空间坐标系到相机3D坐标系的转换 Pose 即可。如果上述输入端口的点云位于机器人坐标系,则这里需要输入 RGB空间坐标系到机器人3D坐标系的的转换 Pose 。在点云是相机坐标系的情况,该Pose 即为 TyCameraResource 的 extrinsic_pose 参数,也可以直接由 LoadCalibFile 算子给出。

  • color_calib_info

    • 数据类型:CalibInfo

    • 输入内容:图漾相机的出厂标定参数,可以从 TyCameraAccess 算子输出,也可以由 LoadCalibFile 算子输出。

  • rgb

    • 数据类型:Image

    • 输入内容:**一般不需要连接该端口。**假设通过 image_points 输入的像素点是基于 M-N 尺寸的图像,与 color_calib_info 的出厂标定信息对应的图像尺寸一致时(常规情况) ,则无需连接该端口。与 color_calib_info 的出厂标定信息对应的图像尺寸不一致时,此时需通过该端口输入一张 M-N 尺寸的图像

输出:

  • pose_list

    • 数据类型:PoseList

    • 输出内容:将像素点转换成 3D 点后的 Pose 列表(仅位置信息有效,姿态角度全部为0)

功能演示

使用 ProjectPoints 算子将加载的 RGB 掩码图中 2D 像素点 (ImagePoints 数据格式)转换为 3D 空间点( Pose 格式)。

步骤1:算子准备

添加 Trigger(2 个)、Load(2 个)、LoadCalibFile、Emit、ProjectPoints算子至算子图。

步骤2:设置算子参数

  1. 设置 Trigger 算子参数:

    • 算子名称 → Init

    • 类型 → InitTrigger

  2. 设置 Load 算子参数:

    • 算子名称 → LoadImage

    • 类型 → Image

    • 文件→ icon_more→选择图像文件名 ( example_data/ProjectPoints/rgb.png )

    • 图像 → icon_visOn 可视

  3. 设置 Load_1 算子参数:

    • 算子名称 → LoadPointCloud

    • 类型 → PointCloud

    • 文件→ icon_more→选择与图像匹配点云文件名 ( example_data/ProjectPoints/cloud.pcd )

    • 点云 → icon_visOn可视 → icon_color -2 →icon_size 2

  4. 设置 LoadCalibFile 算子参数:

    • 算子名称 → rgb_Calib

    • 文件 → 图漾相机出厂标定文件 ( example_data/ProjectPoints/ty_color_calib.txt

  5. 设置 Emit 算子参数:

    • 算子名称 → EmitImagePoints

    • 类型 →ImagePoints

  6. 设置 ProjectPoints 算子参数:

    • 像素映射半径→5

    • 坐标列表 → icon_visOn可视

步骤3:连接算子

Calibration_ProjectMask_ProjectPoint_nodes

步骤4:设置 Emit 算子的 points 属性

  1. 点击 RVS 的运行按钮,Init (InitTrigger) 算子自动运行,并触发 Load (image) 算子。

    Calibration_ProjectMask_ProjectPoint_SetPixel

  2. 在 2D 视图查看 Load (image) 图像。将鼠标移动到目标像素位置(本案例选择下图中间盒子的右下角),此时在 2D 视图左下方实时查看鼠标光标对应位置的像素值(x,y)。

    Calibration_ProjectMask_ProjectPoint_GetPixel

  3. 将目标像素的数值填写到 Emit (ImagePoints) 算子的 points 属性中,如中间盒子的右下角像素值 686 502。

    Clibration_ProjectPoints_result

运行结果

  1. 触发 Trigger 算子,运行效果如下图所示。

  2. 由于盒子右下角的点云信息不全,在该点周边 5 (pixel_project_radius 设定值) 的像素半径区域内查找所有具有对应 3D 点的像素点,将其中距离该像素点最近的 3D 点作为映射结果。 Calibration_ProjectMask_ProjectPoint_result

Fast

算子参数

  • 像素映射半径/pixel_project_radius:由于IR镜头成像受干扰较多,所以某个 2D 像素点可能没有对应的深度值。此时算子会在该 2D 像素点所对应的深度像素点附近pixel_project_radius 的像素半径区域内查找所有具有深度值的像素点,将其中距离该像素点最近的像素点的对应深度值作为该像素点的替代深度值进行后续运算、

    说明:同上述 General 模式的区别:这里仅仅使用了 Z 数值作为替代,但是 X Y 仍然使用自身的数值。

  • 相机深度图标定文件/depth_calib_filename:图漾相机 depth 出厂标定参数文件路径,作用同输入端口的 depth_calib_info 一致。当输入端口 depth_calib_info没有连接时,则必须给该参数赋值。当输入端口 depth_calib_info 有连接时,则优先使用输入端口的数值。

  • 其余参数:同上述General模式的描述一致。

数据信号输入输出

输入:

  • depth

    • 数据类型:Image

    • 输入内容:掩码图的原图所对应的深度图。一般来自于 TyCameraAccess 算子的 depth 输出端口。

  • depth_calib_info

    • 数据类型:CalibInfo

    • 输入内容:图漾相机 depth 出厂标定参数,可以从 TyCameraAccess 算子输出,也可以由 LoadCalibFile 算子输出。

  • 其余参数:同上述 General 模式的描述一致。

输出:

  • pose_list

    • 数据类型:PoseList

    • 输出内容:将像素点转换成 3D 点后的 Pose 列表(仅位置信息有效,姿态角度全部为 0 )

功能演示

运行步骤以及选取的 2D 像素点同上述 General 模式,连线如下。

Calibration_ProjectMask_ProjectPointFast_nodes

运行结果如下。

说明:下图中较大的 Pose 是本次运行的结果,较小的 Pose 是上述 General 模式下运行的结果。通过比较两个 Pose 可以看出两种模式的区别。较大的Pose 更贴近我们选取的 2D 像素点对应的位置,但较大 Pose 本身的位置处并没有实际的成像点,该点位是我们人工生成的。而较小的 pose 对应的位置是距离较大 Pose 最近的真实成像点。

Calibration_ProjectMask_ProjectPointFast_result