#图像处理 #点云 #对齐 #icp #3d #rgbd

align3d

基于迭代最近点(ICP)的点云和图像对齐

4个稳定版本

1.0.3 2023年12月24日
1.0.2 2023年9月30日
1.0.1 2023年9月27日
1.0.0 2023年9月23日

图像类别中排名第199

MIT许可证

250KB
6K SLoC

Align3D - Rust中的迭代最近点(ICP)

Align3D提供了使用迭代最近点(ICP)算法进行范围图像和点云对齐的功能。

它提供以下功能

  • 使用迭代最近点(ICP)算法对范围图像和点云进行对齐。
  • 读取和写入.ply和.off文件,以便轻松数据交换。
  • 支持TUM和IL-RGBD数据集作为输入。
  • 可视化点云、表面和其他几何形状,以检查结果。
  • 处理工具,如范围图像的法线向量计算和深度图像的双边滤波。
  • 里程计算法

Align3D利用多个Rust库来提供其功能

  • ndarray,用于高效的多维数组处理;
  • nalgebra,用于线性代数运算;
  • vulkano,与Vulkan结合用于高性能计算和渲染能力。
  • image用于图像处理任务。通过利用这些库的能力

获取方式

使用Cargo

$ cargo add align3d

或者,要安装带有可视化功能,请使用

$ cargo add align3d --features viz

示例用法

以下代码执行以下操作

  • 加载IndoorLidarDataset;
  • 计算20帧的里程;
  • 显示与地面真相比较的指标;
  • 并显示对齐结果。
use align3d::{
    bilateral::BilateralFilter,
    icp::{multiscale::MultiscaleAlign, MsIcpParams},
    io::dataset::{IndoorLidarDataset, RgbdDataset, SubsetDataset},
    metrics::TransformMetrics,
    range_image::RangeImageBuilder,
    trajectory_builder::TrajectoryBuilder,
    viz::rgbd_dataset_viewer::RgbdDatasetViewer,
};

fn main() -> Result<(), Box<dyn std::error::Error + 'static>> {
    // Load the dataset
    let dataset = Box::new(SubsetDataset::new(
        Box::new(IndoorLidarDataset::load("tests/data/indoor_lidar/bedroom")?),
        (0..20).collect(),
    ));

    // RangeImageBuilder composes the processing steps when loading RGB-D frames (or `RangeImage`).
    let range_image_transform = RangeImageBuilder::default()
        .with_intensity(true) // Use intensity besides RGB
        .with_normals(true) // Compute the normals
        .with_bilateral_filter(Some(BilateralFilter::default())) // Apply bilateral filter
        .pyramid_levels(3); // Compute 3-level Gaussian pyramid.

    // Default ICP parameters
    let icp_params = MsIcpParams::default();

    // TrajectoryBuilder accumulates the per-frame alignment to form the odometry of the camera poses.
    let mut traj_builder = TrajectoryBuilder::default();

    // Use the `.build()` method to create a RangeImage pyramid.
    let mut prev_frame = range_image_transform.build(dataset.get(0).unwrap());

    // Iterate over the dataset
    for i in 1..dataset.len() {
        let current_frame = range_image_transform.build(dataset.get(i).unwrap());
        
        // Perform ICP alignment
        let icp = MultiscaleAlign::new(icp_params.clone(), &prev_frame).unwrap();
        let transform = icp.align(&current_frame);

        // Accumulate transformations for obtaining odometry
        traj_builder.accumulate(&transform, Some(i as f32));
        prev_frame = current_frame;
    }

    // Compute metrics in relation to the ground truth
    // Get the predicted trajectory
    let pred_trajectory = traj_builder.build();
    
    // Get the ground truth trajectory
    let gt_trajectory = &dataset
        .trajectory()
        .expect("Dataset has no trajectory")
        .first_frame_at_origin();

    // Compute the metrics
    let metrics = TransformMetrics::mean_trajectory_error(&pred_trajectory, &gt_trajectory)?;
    println!("Mean trajectory error: {}", metrics);

    // Visualization part
    RgbdDatasetViewer::new(dataset)
        .with_trajectory(pred_trajectory.clone())
        .run();

    Ok(())
}

Mean trajectory error: angle: 1.91°, translation: 0.03885

并显示一个类似这样的窗口

(使用WASD控制移动相机)

基准测试

功能 输入描述。 [最小值,平均值,最大值]
ImageIcp 1个640x480输入 [38.423 ms 38.576 ms 38.732 ms]
kdtree 500000个数据库与500000个3D点查询 [101.48 ms 101.75 ms 102.04 ms]
compute_normals 640x480 RGB-D帧 [1.1587 ms 1.1778 ms 1.2005 ms]
  • 硬件:第11代英特尔® 酷睿™ i7-11800H @ 2.30GHz × 16

贡献

欢迎为Align3D做出贡献!如果您发现任何问题或对改进有建议,请创建新问题或提交拉取请求。

许可证

Align3D 采用 MIT 许可证授权。

发布计划

Align3D 是一个实验性项目,展示了使用 Rust 编写计算机视觉应用程序的潜力。尽管它仍然是一个实验性项目,但它展示了 Rust 相比于在计算机视觉和机器学习中常用的传统 C++ 和 Python 组合所提供的多功能性和性能优势。

项目有以下路线图

  • PCL ICP 的错误修复。
  • 优化图像 Icp 性能
  • Python 绑定

依赖项

~14–34MB
~595K SLoC