open3D:三维点云处理

open3d 点云数据处理

爆肝5万字❤️Open3D 点云数据处理基础(Python版)_python 点云 焊缝-CSDN博客

如何用NumPy读取和保存点云数据 - 知乎

读取并可视化点云

np.loadtxt 从txt中读取点集,并open3d显示单个点云

 txt内容:每行皆为一个点 xyz,逗号隔开,xy为图像坐标,z为图像序号,所有图的点集皆存入一个txt

import open3d as o3d
import numpy as np# points_data = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/vp/11pnts.txt", delimiter=",", dtype=np.float32)
points_data = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/vp/11pnts.txt", delimiter=",")
print('shape: ', points_data.shape)
print('data type: ', points_data.dtype)points_data[:,2] = points_data[:,2] * 21 # 将所有行的第三列乘以 21# points_data = np.random.rand(100, 3)  # 示例数据:100 个随机 3D 点
colors_data = np.random.rand(100, 3)  # 100 个随机 RGB 颜色数组pcd = o3d.geometry.PointCloud() # 创建一个空的点云对象
pcd.points = o3d.utility.Vector3dVector(points_data[:, :3]) # 从NumPy数组points_data中分配3D点(取前3列作为 x,y,z 坐标)
pcd.colors = o3d.utility.Vector3dVector(colors_data)  # 分配颜色信息
o3d.visualization.draw_geometries([pcd]) # 可视化点云

 

读取.pcd文件

import open3d as o3d
import numpy as npprint("->正在加载点云... ")
pcd = o3d.io.read_point_cloud("test.pcd")
print(pcd)print("->正在可视化点云")
o3d.visualization.draw_geometries([pcd])

读取.pts文件,并进行网格化 (Mesh化)

原始点云为.pts文件,内容为x,y,z的坐标

import open3d as o3d
import numpy as np# 读取.pts文件
def read_pts_file(filename):with open(filename, 'r') as f:lines = f.readlines()pts = []for line in lines:data = line.strip().split()pts.append([float(data[0]), float(data[1]), float(data[2])])return np.array(pts)# 加载.pts文件
pts_filename = "E:\Airplane.pts"  # 替换为.pts文件路径
pts = read_pts_file(pts_filename)# 创建open3d格式的点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(pts)# 创建alpha shape并进行mesh化
alpha = 0.015  # 设置alpha值
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)# 可视化网格化后的结果
o3d.visualization.draw_geometries([mesh], window_name="网格化结果")

同一窗口可视化多个点云

o3d.visualization.draw_geometries([pcd1, pcd2, ... ,pcdn])

# 加载点云1
pcd1 = o3d.io.read_point_cloud("bunny.pcd")
print(pcd1)# 加载点云2
pcd2 = o3d.io.read_point_cloud("bunny0.pcd")
print(pcd2)# 可视化两个点云
o3d.visualization.draw_geometries([pcd1, pcd2])
space = 2500
pnts_r = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/vpr/11pnts.txt", delimiter=",")
pnts_r[:,2] = pnts_r[:,2] * 36 # 将所有行的第三列乘以 21
pnts_r[:,1] = pnts_r[:,1] + space
pnts_r[:,0] = pnts_r[:,0] * 4
pnts_d = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/vpd/11pnts.txt", delimiter=",")
pnts_d[:,2] = pnts_d[:,2] * 36 # 将所有行的第三列乘以 21
pnts_d[:,1] = pnts_d[:,1] + space*2
pnts_d[:,0] = pnts_d[:,0] * 2
pnts_s = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/散热片划痕/11pnts.txt", delimiter=",")
pnts_s[:,2] = pnts_s[:,2] * 16 # 将所有行的第三列乘以 21
pnts_s[:,1] = pnts_s[:,1] + space*3
pnts_s[:,0] = pnts_s[:,0] * 2def get_pcd(points_data):pcd = o3d.geometry.PointCloud()  # 创建一个空的点云对象pcd.points = o3d.utility.Vector3dVector(points_data[:, :3])  # 从NumPy数组points_data中分配3D点(取前3列作为 x,y,z 坐标)pcd.colors = o3d.utility.Vector3dVector(colors_data)  # 分配颜色信息return pcdpcd_r = get_pcd(pnts_r)
pcd_d = get_pcd(pnts_d)
pcd_s = get_pcd(pnts_s)
o3d.visualization.draw_geometries([pcd_r,pcd_d,pcd_s]) # 可视化点云

下采样,两种去除离群点,均值滤波

# points_data = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/vp/11pnts.txt", delimiter=",", dtype=np.float32)
points_data = np.loadtxt("E:/vsproject/勋仪交接/标克艾芬达暖水管/测量主管尺寸/vpc/11pnts.txt", delimiter=",")
print('shape: ', points_data.shape)
print('data type: ', points_data.dtype)points_data[:,2] = points_data[:,2] * 36 # 将所有行的第三列乘以 21
points_data[:,0] = points_data[:,0] * 4# points_data = np.random.rand(100, 3)  # 示例数据:100 个随机 3D 点
colors_data = np.random.rand(100, 3)  # 100 个随机 RGB 颜色数组pcd = o3d.geometry.PointCloud() # 创建一个空的点云对象
pcd.points = o3d.utility.Vector3dVector(points_data[:, :3]) # 从NumPy数组points_data中分配3D点(取前3列作为 x,y,z 坐标)
pcd.colors = o3d.utility.Vector3dVector(colors_data)  # 分配颜色信息# 1. 下采样(降采样)
down_pcd = pcd.voxel_down_sample(voxel_size=0.05)
print("下采样后的点云数量:", len(np.asarray(down_pcd.points)))# 2. 去除离群点
# 统计离群点移除
cl, ind = down_pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
statistical_outlier_removed = down_pcd.select_by_index(ind)
print("统计离群点移除后的点云数量:", len(np.asarray(statistical_outlier_removed.points)))# 半径离群点移除
# cl, ind = statistical_outlier_removed.remove_radius_outlier(nb_points=16, radius=0.05)
cl, ind = statistical_outlier_removed.remove_radius_outlier(nb_points=6, radius=11)
radius_outlier_removed = statistical_outlier_removed.select_by_index(ind)
print("半径离群点移除后的点云数量:", len(np.asarray(radius_outlier_removed.points)))# 3. 滤波(平滑) - 自定义均值滤波
def mean_filter(pcd, k=5):''' 对每个点找到其k个最近的邻居并计算均值作为滤波后的点坐标 '''points = np.asarray(pcd.points)filtered_points = np.zeros_like(points)for i in range(len(points)):# 找到k个最近的邻居(这里简化处理,实际应用中可以使用KD树等高效方法)distances = np.linalg.norm(points - points[i], axis=1)nearest_indices = np.argsort(distances)[:k]filtered_points[i] = np.mean(points[nearest_indices], axis=0)filtered_pcd = o3d.geometry.PointCloud()filtered_pcd.points = o3d.utility.Vector3dVector(filtered_points)return filtered_pcdfiltered_pcd = mean_filter(radius_outlier_removed, k=5)
print("均值滤波后的点云数量:", len(np.asarray(filtered_pcd.points)))# 可视化原始点云和处理后的点云
# o3d.visualization.draw_geometries([pcd]) # 可视化点云
o3d.visualization.draw_geometries([pcd], window_name="原始点云")
o3d.visualization.draw_geometries([down_pcd], window_name="下采样后的点云")
o3d.visualization.draw_geometries([statistical_outlier_removed], window_name="统计离群点移除后的点云")
o3d.visualization.draw_geometries([radius_outlier_removed], window_name="半径离群点移除后的点云")
o3d.visualization.draw_geometries([filtered_pcd], window_name="均值滤波后的点云")

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

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

相关文章

使用联邦多轨迹图神经网络(GNNs)结合稀缺数据预测婴儿脑连接|文献速递-深度学习医疗AI最新文献

Title 题目 Predicting infant brain connectivity with federated multi-trajectory GNNs using scarce data 使用联邦多轨迹图神经网络(GNNs)结合稀缺数据预测婴儿脑连接 01 文献速递介绍 多模态影像下的婴儿脑连接演化预测:联邦学习与…

[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制

Linux 内核作为一个多任务操作系统,其进程管理子系统是核心组成部分之一。无论是用户应用的运行、驱动行为的触发,还是系统调度决策,几乎所有操作都离不开进程的创建、调度与销毁。本文将从进程的概念出发,深入探讨 Linux 内核中进…

第16节 Node.js 文件系统

Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node 导入文件系统模块(fs)语法如下所示: var fs require("fs") 异步和同步 Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本&#xff…

《探秘局域网广播:网络世界的 “大喇叭”》

揭开局域网广播的神秘面纱 在当今数字化时代,网络已成为人们生活和工作中不可或缺的一部分。从日常的网页浏览、社交媒体互动,到企业级的数据传输、云计算应用,网络通信无处不在。在这个庞大而复杂的网络世界里,数据如同信息流在各个节点之间穿梭,而局域网广播则是其中一种…

基于Ubuntu22.04安装SVN服务器之仓库迁移

基于Ubuntu22.04安装SVN服务器之仓库迁移 第一步: 停止svn服务器 第一步: 停止svn服务器 1)建议迁移的时候先把SN服务器停掉,以免操作失败。 svnserve -d -r /usr/svn第二步:dump出svn代码库 1)通过dump出旧的svn服务器上的代码…

Unity UI 性能优化终极指南 — Image篇

🎯 Unity UI 性能优化终极指南 — Image篇 🧩 Image 是什么? Image 是UGUI中最常用的基本绘制组件支持显示 Sprite,可以用于背景、按钮图标、装饰等是UI性能瓶颈的头号来源之一,直接影响Draw Call和Overdraw &#x1…

「Java基本语法」代码格式与注释规范

Java代码的基本格式 Java代码的规范格式是编写和维护Java程序的基础,其中包括类定义、方法定义、代码缩进、大括号位置等。 1.核心规则 每个Java文件必须包含一个公共类(public class),且Java源文件的文件名必须和这…

2025年AI编程工具推荐

目录 👑 **一、全能型AI开发环境(IDE)**🛠️ **二、AI代码助手与插件**🎯 **三、垂直领域工具**🇨🇳 **四、国产工具精选**🔮 **五、创新前沿工具**⚖️ **选型建议** 2025年&#x…

【工具使用】STM32CubeMX-FreeRTOS操作系统-信号标志、互斥锁、信号量篇

一、概述 无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片FreeRTOS信号标志、互斥锁和信号…

ArrayList和LinkedList(深入源码加扩展)

ArrayList 和 LinkedList 是 Java 集合框架中两种常用的列表实现,它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。 1. ArrayList 和 LinkedList 的底层区别 (1) 底层数据结构 ArrayList: 基于动态数组(Dynamic Ar…

浅谈 React Suspense

React Suspense 是 React 中用于处理异步操作的功能。它可以让你"等待"某些操作,如数据获取或组件加载完成,然后再渲染组件。Suspense 的核心理念是让组件在准备好之前显示一个备用的 UI,例如加载指示器,从而提高用户体…

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…

Linux【4】------RK3568启动和引导顺序

引导顺序 RK3568 的启动流程如下: 加电后,芯片首先执行 BootROM 中的代码; BootROM 会尝试从配置好的外部设备(如 NOR/NAND/eMMC/SD 卡)加载启动程序; 如果这些设备都没有有效的启动代码,Bo…

Deepseek/cherry studio中的Latex公式复制到word中

需要将Deepseek/cherry studio中公式复制到word中,但是deepseek输出Latex公式,比如以下Latex代码段,需要通过Mathtype翻译才能在word中编辑。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…

【机器学习】支持向量机实验报告——基于SVM进行分类预测

目录 一、实验题目描述 二、实验步骤 三、Python代码实现基于SVM进行分类预测 四、我的收获 五、我的感受 一、实验题目描述 实验题目:基于SVM进行分类预测 实验要求:通过给定数据,使用支持向量机算法(SVM)实现分…

前端开发面试题总结-JavaScript篇(二)

文章目录 其他高频问题15、JS的数据类型有哪些16、如何判断数组类型?17、解释 this 的指向规则18、跨域问题及解决方案19、宏任务与微任务的区别是什么?列举常见的宏任务和微任务。20、为什么微任务的优先级高于宏任务?设计目的是什么&#x…

硬件电路设计-开关电源设计

硬件电路设计-开关电源 电容选取设置输出电压电感的选取PCB布局典型电路 这里以杰华特的JW5359M 开关电源为例,介绍各个部分的功能电路。 当EN引脚电压低于0.4V时,整个稳压器关闭,稳压器消耗的电源电流降至1μΑ以下 电容选取 1.C1和C25构成…

phosphobot开源程序是控制您的 SO-100 和 SO-101 机器人并训练 VLA AI 机器人开源模型

​一、软件介绍 文末提供程序和源码下载 phosphobot开源程序是控制您的 SO-100 和 SO-101 机器人并训练 VLA AI 机器人开源模型。 二、Overview 概述 🕹️ Control your robot with the keyboard, a leader arm, a Meta Quest headset or via API 🕹️…

数据通信基础

信道特性 1.信道带宽W • 模拟信道:Wf2-f1(f2和f1分别表示:信道能通过的最高/最低频率,单位赫兹Hz)。 • 数字信道:数字信道是离散信道,带宽为信道能够达到的最大数据传输速率,单位…