Open3D学习点云读取与显示

文章目录

点云读取

点云

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()
相关推荐
DANGAOGAO2 小时前
Transformer学习
深度学习·学习·transformer
电子云与长程纠缠2 小时前
Godot学习04 - UI界面
学习·ui·godot
少许极端2 小时前
算法奇妙屋(三十五)-贪心算法学习之路 2
学习·算法·贪心算法
`Jay2 小时前
Python Redis连接池&账号管理池
redis·分布式·爬虫·python·学习
red_redemption2 小时前
自由学习记录(146)
学习
pq113_63 小时前
开源软件学习笔记 - nanoModbus
笔记·学习·nanomodbus
似水明俊德3 小时前
12-C#.Net-加密解密-学习笔记
笔记·学习·oracle·c#·.net
chinalihuanyu3 小时前
Linux-应用编程学习笔记(五、系统信息和系统资源)
笔记·学习
C羊驼3 小时前
C语言学习笔记(十四):编译与链接
c语言·开发语言·经验分享·笔记·学习