如何在Ubuntu当中利用CloudCompare软件进行点云配准拼接?

1.首先需要安装相应的cloudcompare软件,以下有两种方式:第一种直接在ubuntu的软件商店里搜索CloudCompare软件进行install,我这里已经安装完毕。

方式二:可以直接原码安装:

github地址: https://github.com/CloudCompare/CloudCompare.git

 

 

  1. git clone    https://github.com/CloudCompare/CloudCompare.git

  2. cd CloudCompare

  3. cmake .. -DCMAKE_BUILD_TYPE=Rlease -DPLUGIN_STANDARD_QPCL=ON #这里确保能打开pcd

  4. make -j 8

  5. sudo make install

  6. sudo apt install cloudcompare

2.打开之后软件的界面如下所示:

 

3.关于软件的基本操作,比如打开保存,以及点云的颜色大小,这里我们只了解关于点云配准和拼接的基本功能,详细的功能大家可以自己去摸索摸索。由于我是第一种安装,打开pcd只能靠拖动pcd文件到这个界面,比如:

4.之后可以在点云属性下调整点云的大小,以及在edit -colors-set unique中设置相应的颜色,然后在如下左下角的点云属性中选择pointsize,根据需要选择大小,点云属性框里设置点云的大小:

 5.设置完之后调整一下相应的视角:

6.然后选中两个点云,点击如下工具,之后点击yes,一个基准点云,开始手动选择特征点

7.选完之后点击alian会自动根据当前选择的特征点进行匹配, 点击reset可以取消当前配准,之后点对号可以生成相应的旋转平移矩阵,大家可以alian一下后看实际的配准效果,不行的话可以删除偏离较大的点,就是点对应点A0,R0后面的叉号:

8. 之后点击ok会在console,也就是最下面生成更为准确的结果:

9.后续可以利用之前的多尺度icp程序在此旋转矩阵上进行更为精准的旋转平移矩阵的生成。

import open3d as o3d
import numpy as npdef load_point_cloud(file_path):"""加载 .pcd 格式的点云文件"""point_cloud = o3d.io.read_point_cloud(file_path)if point_cloud.is_empty():raise ValueError(f"点云文件 {file_path} 为空或加载失败。")return point_clouddef preprocess_point_cloud(pcd, voxel_size):"""预处理点云以加速配准。参数:- pcd: 输入的点云- voxel_size: 体素化大小,用于法向量估计返回:- 体素化并估计法向量后的点云"""pcd = pcd.voxel_down_sample(voxel_size)pcd.estimate_normals(o3d.geometry.KDTreeSearchParamHybrid(radius=voxel_size * 2, max_nn=30))return pcddef apply_icp(source, target, threshold=0.02, init_transformation=None, use_point_to_plane=False):"""使用 ICP 进行点云配准。参数:- source: 源点云 (o3d.geometry.PointCloud)- target: 目标点云 (o3d.geometry.PointCloud)- threshold: 配准的距离阈值- init_transformation: 初始对齐矩阵 (4x4)- use_point_to_plane: 是否使用点到平面 ICP 方法 (默认 False)返回:- 精确配准后的变换矩阵 (4x4)"""print("运行 ICP 配准...")# 选择 ICP 估计方法:点到点或点到平面estimation_method = o3d.pipelines.registration.TransformationEstimationPointToPoint()if use_point_to_plane:estimation_method = o3d.pipelines.registration.TransformationEstimationPointToPlane()# 多尺度 ICP 配准max_iterations = [60, 30, 10]  # 多尺度迭代次数thresholds = [threshold * 5, threshold * 2, threshold]  # 多尺度阈值transformation = init_transformationfor scale, max_iter, th in zip([5, 2, 1], max_iterations, thresholds):print(f"Scale {scale}: 距离阈值 = {th}, 最大迭代次数 = {max_iter}")reg_p2p = o3d.pipelines.registration.registration_icp(source, target, th, transformation, estimation_method,o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=max_iter))transformation = reg_p2p.transformationprint(f"Scale {scale} 结果变换矩阵:\n", transformation)return transformationdef main():# 加载点云文件 (替换为实际路径)source_pcd_file = "/home/xsl/Music/truck_ws/src/Truck_perception/tool/1.pcd"  # 源点云文件路径target_pcd_file = "/home/xsl/Music/truck_ws/src/Truck_perception/tool/2.pcd"  # 目标点云文件路径source_cloud = load_point_cloud(source_pcd_file)target_cloud = load_point_cloud(target_pcd_file)# 预处理点云以估计法向量voxel_size = 0.2  # 根据点云密度调整体素大小source_cloud = preprocess_point_cloud(source_cloud, voxel_size)target_cloud = preprocess_point_cloud(target_cloud, voxel_size)# 可视化初始状态print("初始点云对齐可视化")o3d.visualization.draw_geometries([source_cloud.paint_uniform_color([1, 0, 0]), target_cloud.paint_uniform_color([0, 1, 0])])# 初始变换矩阵initial_transformation = np.array([[0.319, 0.947,  0.016, 5.343],[-0.948,  0.319,  0.004,  9.281],[-0.001, -0.017,  1, -0.296],[0,  0,  0,  1]])# ICP 配准transformation_matrix = apply_icp(source_cloud, target_cloud, threshold=0.5, init_transformation=initial_transformation, use_point_to_plane=True)# 将源点云变换到目标点云坐标系source_cloud.transform(transformation_matrix)# 可视化配准结果print("配准结果可视化")o3d.visualization.draw_geometries([source_cloud.paint_uniform_color([1, 0, 0]), target_cloud.paint_uniform_color([0, 1, 0])])# 保存结果np.savetxt("Rotation translation matrix.txt", transformation_matrix, fmt="%.6f")print("外参矩阵已保存到 Rotation translation matrix.txt") if __name__ == "__main__":main()

10.别忘了更改实际的pcd文件地址,相应的初始变换矩阵就是8生成最终的旋转平移矩阵以及最终的对其效果:

11.点云配准结束,关于点云配准的其它更多详细操作,建议参考一下博客:CloudCompare——实现点云由粗到精的配准【2024最新版】_点云粗配准-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贴贴,一款windows剪切板管理软件

贴贴,一款windows剪切板管理软件 软件下载官网 https://tietieapp.com 软件界面 软件界面简洁、信息展示清晰。软件会自动记录你复制过的内容。包括哪个软件复制的、复制的时间。支持图片、文本、文件等多种格式。支持持久化,电脑重启记录仍然存在。支持…

泷羽sec学习打卡-html基础

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于云技术基础的那些事儿-捕获帅照 html基础什么是html? 常用的html标签html示例 css基础什…

RocketMQ的使⽤

初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种⽅式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要⻢上回复。 两种⽅式各有优劣,打电话可以⽴即得到响应,但…

java 字符 ASCII码 详解

在 Java 中,字符 (char) 和 ASCII 码的关系是通过 Unicode 字符集建立的。以下是 Java 中字符与 ASCII 码相关的详解。 1. 什么是 ASCII 和 Unicode? ASCII (American Standard Code for Information Interchange) ASCII 码 是一种字符编码标准&#x…

初试无监督学习 - K均值聚类算法

文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象,并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…

JSON,事件绑定

文章目录 JSON事件绑定输入框input和div的内容返回获取dom元素数组还是单个对象for循环为什么要写const那一行,直接写 hobbys[index].checked true;可以吗const不是常量吗,为什么用const声明的element的属性值可以改变? 黑马学习笔记 JSON 定…

学习HTML第三十一天

学习文章目录 七. 普通按钮八. 文本域九.下拉框 七. 普通按钮 注意点:普通按钮的 type 值为 button ,若不写 type 值是 submit 会引起表单的提交 八. 文本域 常用属性如下: rows 属性:指定默认显示的行数,会影响文…

基于Multisim的汽车尾灯控制电路设计与仿真

1、电路由四个按键控制,分别对应左转、右转、刹车和检查。 2、当左转或右转键按下时,左侧或右侧的 3个汽车尾灯按照左循环或右循环的顺!2/3 点亮,点亮时间为 1秒。 3、当刹车时,所有的尾灯同时闪烁,闪烁时间为1秒。 4、当检查时…

7天掌握SQL - 第三天:MySQL实践与索引优化

目录 安装MySQL创建数据库和表结构SQL语句实操练习MySQL高级特性索引设计与优化总结 1. 安装MySQL 1.1 下载与安装 MySQL可以通过官方网站下载安装包。以下是安装MySQL的基本步骤: 访问MySQL官方网站 MySQL Downloads。选择适合您操作系统的版本进行下载。安装…

osg、osgearth简介及学习环境准备

一、osg简介(三维场景图渲染与调度引擎) OSG是Open Scene Graphic 的缩写,OSG于1997年诞生于以为滑翔机爱好者之手,Don burns 为了对滑翔机的飞行进行模拟,对openGL的库进行了封装,osg的雏形就这样诞生了&…

小程序-使用 iconfont 图标库报错:Failed to load font

官方默认可以忽略此错误,在清除缓存后首次刷新会显示此错误,重新渲染错误消失 解决方法: 在 iconfont 图标库选择项目设置 选中 Base64 保存,重新点击链接 -> 复制代码到项目中 操作步骤:

GEE 训练教程——Sentinel-1的卷积(核函数)的分析和可视化

目录 简介 函数 convolve(kernel) Arguments: Returns: Image ee.Kernel.fixed(width, height, weights, x, y, normalize) Arguments: Returns: Kernel 代码解释 代码 结果 简介 GEE 训练教程——Sentinel-1的卷积(核函数)的分析和可视化 函数 convolve(kerne…

Stable Diffusion的解读(二)

Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…

13. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--完善TODO标记的代码

这篇文章特别短,短到可以作为一篇文章的一个章节,那让我们开始吧 一、编写代码 我们在代码中标记了大量的TODO标记,并且注明了这里暂时写死,等权限和授权完成后再改为动态获取这句话。那么到目前为止和权限有关的代码已经完成了…

Rust “xxx“.to_string()和Rust String::from(“xxx“)区别(将字符串字面量(str类型)转换为String类型)

文章目录 Rust "xxx".to_string()和Rust String::from("xxx")区别1. .to_string()(能够将任何可以显示的类型(如数字、结构体等)转为字符串)2. String::from()区别总结:性能:示例对比&…

如何设置谷歌浏览器的家庭保护功能

谷歌浏览器是全球使用最广泛的网络浏览器之一,提供了许多强大的功能和扩展。对于有小孩的家庭来说,设置家庭保护功能可以帮助家长管理孩子的上网行为,确保他们在一个安全、健康的网络环境中浏览网页。本文将详细介绍如何设置谷歌浏览器的家庭…

Vue:后端返回二进制文件,前端如何实现浏览器自动下载?

Vue项目开发中,遇到界面下载功能时,前端如何实现将后端返回二进制文件在浏览器自动下载? 一、关键代码: export function downloadFile(fileName) {axios({method: post,url: process.env.VUE_APP_BASE_API /cgi-bin/file,data:…

dpdk ppe模块细分

在基于 openEuler 系统运行 DPDK(Data Plane Development Kit) 时,涉及到的 PPE(Packet Processing Engine) 中的 SSU(Service Scheduling Unit)、PPP(Packet Processing Pipeline&a…

触发器清零引脚要上拉高电平

在使用触发器设计电路时,清零引脚该如何处理呢? 下图中NCLR是清零引脚,由于未使用就悬空了,没有任何电气连接,这样做是不对的。应该上拉至高电平。 加入电阻R3,上拉至3.3V,这样不使用清零功能的…

FPGA经验谈系列文章——9、块储存器的高效使用

前言 每个7系列的FPGA都包含多个36Kb容量的块存储器,俗称BlockRAM。一个BlockRAM是36Kb,它能够拆分成独立的两个18Kb,因此最小的使用单位就是18Kb。如果只想使用1Kb怎么办?不好意思,也得占用半个块存储资源18Kb。那如果使用了19Kb的话,那么就得使用一个完整的36Kb的Block…