文章目录
点云读取
点云
c
import open3d as o3d
pcd = o3d.io.read_point_cloud("D:\\PCL\\\cloud\\bunny.pcd")
o3d.visualization.draw(pcd)
//写入点云
o3d.io.write_point_cloud("copy_bunny.pcd", pcd)

三角网格
c
import open3d as o3d
plymesh = o3d.io.read_triangle_mesh("bunny10k.ply")
o3d.visualization.draw(plymesh)
o3d.io.write_triangle_mesh("copy_bunny10k.ply", plymesh)


py
# 导入Open3D库(处理3D数据:点云、RGBD、相机等)
import open3d as o3d
# 导入Matplotlib库(绘制2D图像,可视化RGBD的颜色和深度图)
import matplotlib.pyplot as plt
# 打印提示信息,说明当前处理的是Redwood数据集(经典的RGBD数据集)
print("Read Redwood dataset")
# 1. 读取彩色图像(JPG格式,RGB彩色图)
color_raw = o3d.io.read_image("00000.jpg")
# 2. 读取深度图像(PNG格式,单通道深度图,每个像素值代表距离相机的深度)
depth_raw = o3d.io.read_image("00000.png")
# 3. 将彩色图+深度图合并为RGBD图像(Open3D专用的RGBDImage数据结构)
# create_from_color_and_depth:Open3D内置函数,自动对齐彩色图和深度图的尺寸/坐标系
# 注:默认参数已适配Redwood数据集,无需额外调整
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color_raw, depth_raw)
# 打印RGBD图像的基本信息(尺寸、是否对齐等),验证读取成功
print(rgbd_image)
# 4. 用Matplotlib可视化RGBD图像的彩色和深度通道(2D展示)
# 创建1行2列的子图布局,用于并排显示彩色图和深度图
plt.subplot(1, 2, 1)
plt.title('Redwood grayscale image') # 设置子图标题(这里显示的是灰度图,因RGBDImage默认转灰度)
plt.imshow(rgbd_image.color) # 显示彩色通道(实际为灰度,如需RGB可调整参数)
plt.subplot(1, 2, 2)
plt.title('Redwood depth image') # 子图标题:深度图
plt.imshow(rgbd_image.depth) # 显示深度通道(像素值越大,距离越远,颜色越亮)
plt.show() # 弹出可视化窗口,展示两张子图
# 5. 从RGBD图像生成3D点云(核心步骤)
# create_from_rgbd_image:通过相机内参将2D像素坐标+深度值转换为3D空间坐标
# 参数1:待转换的RGBD图像
# 参数2:相机内参(PinholeCameraIntrinsic),这里用PrimeSenseDefault(经典深度相机内参,适配Redwood)
# PrimeSenseDefault:预设的内参(分辨率640x480,fx=525, fy=525, cx=319.5, cy=239.5),模拟真实深度相机
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
rgbd_image,
o3d.camera.PinholeCameraIntrinsic(
o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
# 6. 点云坐标变换(修正视角,让点云可视化时朝向正确)
# 变换矩阵:[[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]]
# 作用:Y轴和Z轴取反,解决RGBD生成的点云"上下/前后颠倒"的问题(Open3D可视化视角适配)
# 原理:4x4齐次变换矩阵,前三行前三列是旋转,最后一列是平移(这里平移为0)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
# 7. 可视化生成的3D点云
# draw_geometries:Open3D可视化函数,传入点云列表即可显示
# 交互操作:鼠标拖拽(旋转)、滚轮(缩放)、Shift+拖拽(平移),按ESC关闭窗口
o3d.visualization.draw_geometries([pcd])


点云可视化
c
# 导入 Open3D 库,用于处理 3D 点云、网格、可视化
import open3d as o3d
# 导入 numpy 数值计算库(这里代码没用到,但导入了也不影响)
import numpy as np
# Python 主程序入口(固定写法,表示下面是主运行代码)
if __name__ == '__main__':
# 读取点云文件(bunny10k.ply)
# o3d.io.read_point_cloud(文件路径, 格式, 移除重复点, 打印日志)
# 参数说明:
# 'bunny10k.ply' :要读取的点云/网格文件
# 'auto' :自动根据后缀判断文件格式(PLY/PCD 等)
# True :自动移除重复的点(避免数据冗余)
# True :在控制台打印读取日志(显示读取了多少点)
ply = o3d.io.read_point_cloud('bunny10k.ply', 'auto', True, True)
# 可视化点云
# draw_geometries(几何对象列表, 窗口名, 窗口宽度, 窗口高度, 是否显示法向量)
o3d.visualization.draw_geometries([ply], # 要显示的点云(必须放列表里)
window_name='Open3D', # 窗口标题
width=1920, height=1080, # 窗口大小
point_show_normal=False) # 不显示点的法向量

点云上色
c
# 导入Open3D库,用于3D点云处理、可视化
import open3d as o3d
# 导入numpy数值计算库(本代码未使用,但保留不影响)
import numpy as np
# 程序主入口(固定写法,表示从这里开始运行)
if __name__ == '__main__':
# 1. 读取点云文件
# 参数说明:
# 'bunny.ply':要读取的点云文件名
# 'auto':自动识别文件格式(PLY/PCD等)
# 第一个True:自动移除重复的点(优化点云数据)
# 第二个True:打印读取信息(控制台输出点数量)
ply = o3d.io.read_point_cloud('bunny.ply', 'auto', True, True)
# 2. 给点云设置【统一颜色】
# [0, 0, 1] = 纯蓝色(RGB格式,数值范围0~1)
ply.paint_uniform_color([0, 0, 1])
# 下面两行是被注释掉的备用颜色(可切换使用)
#ply.paint_uniform_color([1, 0, 1]) # 紫色
# ply.paint_uniform_color([1, 0, 0]) # 红色
# 3. 可视化点云窗口
# [ply]:要显示的点云(必须放在列表里)
# window_name:窗口标题
# width, height:窗口分辨率1920×1080
# point_show_normal=False:不显示点云法向量
o3d.visualization.draw_geometries([ply],
window_name='Open3D',
width=1920, height=1080,
point_show_normal=False)

奇偶排列
c
# 导入Open3D库,用于3D点云读取、处理、可视化
import open3d as o3d
# 导入numpy,用于数组操作(处理点云颜色数据)
import numpy as
# 程序主入口(固定写法,从这里开始运行)
if __name__ == '__main__':
# 1. 读取点云文件 bunny.ply
# 参数:自动识别格式 + 去重点 + 打印加载信息
ply = o3d.io.read_point_cloud('bunny.ply', 'auto', True, True)
# 2. 先把整个点云统一染成 **蓝色**
ply.paint_uniform_color([0, 0, 1])
# 3. 把点云的颜色数据 转换成 numpy 数组(方便修改)
# ply.colors 是Open3D格式,转成np.array才能用索引修改
color = np.array(ply.colors)
# 4. 生成索引列表:只保留 **偶数索引的点**
# i % 2 == 0 → 0、2、4、6... 这些点
inlier = [i for i in range(0, color.shape[0]) if i % 2 == 0]
# 5. 把偶数索引的点 改成 **红色**
color[inlier] = [1, 0, 0]
# 6. 把修改后的颜色 重新赋值给点云
# np数组 → 转回Open3D能识别的 Vector3dVector 格式
ply.colors = o3d.utility.Vector3dVector(color[:, :3])
# 7. 显示点云
# 窗口大小1920×1080,不显示法向量
o3d.visualization.draw_geometries([ply],
window_name='Open3D',
width=1920, height=1080,
point_show_normal=False)

显示法线
c
# 导入Open3D库,用于3D点云处理、可视化
import open3d as o3d
# 导入numpy数值计算库(本代码主要用于数据格式转换/数学计算)
import numpy as np
# 程序主入口(Python固定写法,程序从这里开始运行)
if __name__ == '__main__':
# 1. 读取点云文件 bunny.ply
# 参数1:文件路径
# 参数2:auto → 自动识别文件格式
# 参数3:True → 自动移除重复点,优化数据
# 参数4:True → 控制台输出加载信息(点数量、格式等)
ply = o3d.io.read_point_cloud('bunny.ply', 'auto', True, True)
# 2. 将整个点云渲染为统一的蓝色(RGB:0,0,1 代表蓝色)
ply.paint_uniform_color([0, 0, 1])
# ==================== 核心新功能:计算点云法线 ====================
# 3. 估算点云的法向量(法线:表示点表面的朝向,3D视觉重要特征)
# search_param=KDTree搜索参数,用于查找每个点的邻域点来计算法线
# radius=0.01 → 搜索半径 0.01 米范围内的邻域点
# max_nn=30 → 每个点最多考虑 30 个邻域点
# 法线作用:用于光照渲染、点云配准、曲面重建等
ply.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
# 4. 可视化点云
# [ply] → 要显示的点云对象
# window_name → 窗口标题
# width, height → 窗口分辨率 1920×1080
# left, top → 窗口在屏幕左上角的起始位置
# point_show_normal=True → **关键:显示法线(每个点会画出一条法线线段)**
o3d.visualization.draw_geometries([ply],
window_name="Open3D",
width=1920, height=1080,
left=50, top=50,
point_show_normal=True)

去除隐藏点
c
# 导入Open3D库,用于3D点云处理
import open3d as o3d
# 导入numpy数值计算库(本代码未直接使用)
import numpy as np
# 1. 读取兔子点云文件 bunny.ply
pcd = o3d.io.read_point_cloud("bunny.ply")
# ==================== 核心功能:隐点移除(隐藏点去除) ====================
# 2. hidden_point_removal:去除从【某个视角】看不到的点(遮挡点/背面点)
# 参数1:相机位置/观察点 [0, 0, 0.25] → 从z轴0.25的位置观察点云
# 参数2:相机视野参数 25 → 数值越大,可见范围越大
# 返回值:
# _ :表示忽略第一个返回值(处理后的点云)
# pt_map :保存了【可见点的索引列表】(能看到的点)
_, pt_map = pcd.hidden_point_removal([0, 0, 0.25], 25)
# 3. 根据可见点索引,筛选出能看到的点(删除背面/被遮挡的隐藏点)
pcd = pcd.select_by_index(pt_map)
# 4. 可视化处理后的点云(只剩下正面朝向相机的点)
o3d.visualization.draw_geometries([pcd])

自定义显示Visualizer
c
# 导入Open3D库,用于3D点云处理
import open3d as o3d
# 导入numpy,用于设置颜色数组
import numpy as np
# 1. 读取点云文件 bunny.ply
pcd = o3d.io.read_point_cloud('bunny.ply')
# ==================== 2. 创建自定义可视化窗口 ====================
# 创建可视化句柄(相当于打开一个3D窗口的控制器)
viewer = o3d.visualization.Visualizer()
# 创建窗口:设置窗口名称、宽度、高度
viewer.create_window(window_name='可视化', width=800, height=600)
# ==================== 3. 设置界面渲染参数(核心自定义部分) ====================
# 获取界面参数选项(用来调整背景、点大小、坐标系等)
opt = viewer.get_render_option()
# 设置窗口背景颜色为蓝色 [0,0,1] = 蓝色
opt.background_color = np.asarray([0, 0, 1])
# 设置点的大小(数值越大,点显示得越大)
opt.point_size = 1
# 显示坐标系(左下角会出现红、绿、蓝三色坐标轴)
opt.show_coordinate_frame = True
# ==================== 4. 设置点云颜色 ====================
# 把点云染成红色 [1,0,0]
pcd.paint_uniform_color([1, 0, 0])
# ==================== 5. 开始显示 ====================
# 将点云添加到窗口中
viewer.add_geometry(pcd)
# 激活窗口循环,显示窗口并等待交互
viewer.run()
# 关闭窗口,释放资源
viewer.destroy_window()
