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
250KB
6K SLoC
Align3D - Rust中的迭代最近点(ICP)
Align3D提供了使用迭代最近点(ICP)算法进行范围图像和点云对齐的功能。
它提供以下功能
- 使用迭代最近点(ICP)算法对范围图像和点云进行对齐。
- 读取和写入.ply和.off文件,以便轻松数据交换。
- 支持TUM和IL-RGBD数据集作为输入。
- 可视化点云、表面和其他几何形状,以检查结果。
- 处理工具,如范围图像的法线向量计算和深度图像的双边滤波。
- 里程计算法
Align3D利用多个Rust库来提供其功能
获取方式
使用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(¤t_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, >_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