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

点云配准9:Colored-ICP的Open3D实现

目录

  • 写在前面
  • 准备
  • 原理
  • 代码实现
  • 参考

写在前面

  • 本文内容
    • 基于Open3D实现;
    • Colored-ICP算法进行点云配准;
    • 包含CMakeLists,cpp源码,代码解析,编译脚本,运行结果可视化;
    • 提供免费的可执行文件以及使用说明:待上传
  • 平台/环境
    Windows10, Ubuntu1804, CMake, Open3D
  • 转载请注明出处:
    https://blog.csdn.net/qq_41102371/article/details/136856276

准备

编译安装、使用Open3D、PCL见:
各个版本的Open3D、PCL的编译、使用教程
本文基于Open3D 0.14.1进行编程和测试

原理

点云配准基础、ICP及其变体算法解析,见专栏文章点云配准(PointCloud Registration)

代码实现

(当前20240319,待继续更新)


#include <Eigen/Dense>
#include <iostream>
#include <memory>

#include "open3d/Open3D.h"

using namespace open3d;

void VisualizeRegistration(const open3d::geometry::PointCloud &source,
                           const open3d::geometry::PointCloud &target,
                           const Eigen::Matrix4d &Transformation) {
    std::shared_ptr<geometry::PointCloud> source_transformed_ptr(
            new geometry::PointCloud);
    std::shared_ptr<geometry::PointCloud> target_ptr(new geometry::PointCloud);
    *source_transformed_ptr = source;
    *target_ptr = target;
    source_transformed_ptr->Transform(Transformation);
    visualization::DrawGeometries({source_transformed_ptr, target_ptr},
                                  "Registration result");
}

void PrintHelp() {
    using namespace open3d;

    PrintOpen3DVersion();
    // clang-format off
    utility::LogInfo("Usage:");
    utility::LogInfo("    > RegistrationColoredICP source_pcd target_pcd [--visualize]");
    // clang-format on
    utility::LogInfo("");
}

int main(int argc, char *argv[]) {
    using namespace open3d;

    utility::SetVerbosityLevel(utility::VerbosityLevel::Debug);

    if (argc < 3 ||
        utility::ProgramOptionExistsAny(argc, argv, {"-h", "--help"})) {
        PrintHelp();
        return 1;
    }

    bool visualize = false;
    if (utility::ProgramOptionExists(argc, argv, "--visualize")) {
        visualize = true;
    }

    // Prepare input
    std::shared_ptr<geometry::PointCloud> source =
            open3d::io::CreatePointCloudFromFile(argv[1]);
    std::shared_ptr<geometry::PointCloud> target =
            open3d::io::CreatePointCloudFromFile(argv[2]);
    if (source == nullptr || target == nullptr) {
        utility::LogWarning("Unable to load source or target file.");
        return -1;
    }

    std::vector<double> voxel_sizes = {0.05, 0.05 / 2, 0.05 / 4};
    std::vector<int> iterations = {50, 30, 14};
    Eigen::Matrix4d trans = Eigen::Matrix4d::Identity();
    for (int i = 0; i < 3; ++i) {
        float voxel_size = voxel_sizes[i];

        auto source_down = source->VoxelDownSample(voxel_size);
        source_down->EstimateNormals(open3d::geometry::KDTreeSearchParamHybrid(
                voxel_size * 2.0, 30));

        auto target_down = target->VoxelDownSample(voxel_size);
        target_down->EstimateNormals(open3d::geometry::KDTreeSearchParamHybrid(
                voxel_size * 2.0, 30));

        auto result = pipelines::registration::RegistrationColoredICP(
                *source_down, *target_down, 0.07, trans,
                pipelines::registration::
                        TransformationEstimationForColoredICP(),
                pipelines::registration::ICPConvergenceCriteria(1e-6, 1e-6,
                                                                iterations[i]));
        trans = result.transformation_;

        if (visualize) {
            VisualizeRegistration(*source, *target, trans);
        }
    }

    std::stringstream ss;
    ss << trans;
    utility::LogInfo("Final transformation = \n{}", ss.str());

    return 0;
}

参考

文中已列出

主要做激光/影像三维重建,配准、分割等常用点云算法,熟悉open3d、pcl等开源点云库,技术交流、咨询可私信


http://www.kler.cn/a/274411.html

相关文章:

  • nginx自定义错误日志
  • 详解 Qt WebEngine 模块
  • springboot 与 oauth2 版本对应关系
  • Restaurants WebAPI(二)——DTO/CQRS
  • 网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时
  • 安装opnet14.5遇到的问题
  • Echarts折线图x轴不显示全部数据的解决办法,亲测有效
  • 电脑数据安全新利器:自动备份文件的重要性与实用方案
  • JupytetNotebook常用的快捷键
  • 【Vue3】Vue3中的编程式路由导航 重点!!!
  • test测试类-变量学习
  • 简单算法题收录
  • 【Python操作基础】——变量操作
  • HarmonyOS(鸿蒙)快速入门
  • Avalon总线学习
  • 杨氏矩阵的查找(复杂度<O(N))
  • 水牛社推荐:2024年在家也能赚大钱的五个副业兼职
  • SpringBoot + MyBatisPlus分页查询
  • 外包干了6天,技术明显进步。。。
  • 【二分】第十三届蓝桥杯省赛C++ A组《青蛙过河》(C++)
  • 策略模式在项目中实际应用
  • springboot企业级抽奖项目-整体展示
  • 腾讯云服务器多少钱一个月?5元1个月,这价格没谁了
  • linux单机部署hadoop
  • RK3588_Qt交叉编译环境搭建
  • jenkins 连接harbor 推送镜像