当前位置:首页>python>【小沐学Python】5 分钟搞定点云可视化!Python 点云绘制(五)

【小沐学Python】5 分钟搞定点云可视化!Python 点云绘制(五)

  • 2026-10-06 08:15:41
【小沐学Python】5 分钟搞定点云可视化!Python 点云绘制(五)

戈戈与小沐围坐在一起,悠闲地闲聊着近期追的电视剧台词,氛围轻松惬意。
小沐:累死了。
戈戈:丁元英告诉年轻人不要轻易说这个词,说完就真的马上要倒下。想干成点事,别把别人看得太轻,别把自己看得太重。
戈戈:我想找个井沿扒着看看,哪有?
小沐:农村。这盘菜不是人人都能吃得,扒上了饱了眼福,再掉下去可就跌入了地狱。
聊到这里,戈戈顺势提议聊聊Python点云绘制,聊点轻松的话题。

1、简介

点云可不是什么“高冷技术”,说白了就是在同一空间参考系下,给物体表面“拍”无数个采样点,这些点凑在一起就形成了物体的三维“轮廓”~ 每个点都藏着不少秘密,包括三维坐标(X,Y,Z)、颜色、分类值、强度值等,海量这样的点集合,就是我们要摆弄的“点云(Point Cloud)”,不管是3D建模还是物体识别,都离不开它!

2、vtk库显示点云

想实现点云可视化,vtk开源库必须拥有姓名!它就像一个“万能工具箱”,能轻松搞定三维数据的读取、处理和显示,上手后就能快速get点云的立体效果,官网地址放这啦,按需自取~

https://vtk.org/about/#overview

安装库如下:

pip install vtk

下面是一段python + vtk绘制点云代码示例,直接复制运行就能看到效果~

# python + vtk绘制点云代码示例
import vtk

# 1. 生成点云数据(模拟3D点,可替换为自己的点云数据)
points = vtk.vtkPoints()
colors = vtk.vtkUnsignedCharArray()
colors.SetNumberOfComponents(3)
colors.SetName("Colors")

# 生成1000个随机3D点,颜色随机
import random
for i in range(1000):
    x = random.uniform(-10, 10)
    y = random.uniform(-10, 10)
    z = random.uniform(-10, 10)
    points.InsertNextPoint(x, y, z)
# 随机颜色(RGB)
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    colors.InsertNextTuple3(r, g, b)

# 2. 创建点云数据集
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
polydata.GetPointData().SetScalars(colors)

# 2.1 创建顶点过滤器(将点转换为可见的顶点)
glyph_filter = vtk.vtkVertexGlyphFilter()
glyph_filter.SetInputData(polydata)
glyph_filter.Update()

# 3. 点云渲染设置
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(glyph_filter.GetOutputPort())

actor = vtk.vtkActor()
actor.SetMapper(mapper)
# 设置点的大小
actor.GetProperty().SetPointSize(5)
actor.GetProperty().SetRepresentationToPoints()

# 4. 创建渲染窗口、渲染器和交互器
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)

# 5. 添加演员到渲染器,设置背景色
renderer.AddActor(actor)
renderer.SetBackground(0.1, 0.1, 0.1)  # 深灰色背景

# 6. 启动交互
render_window.Render()
render_window_interactor.Start()

代码运行后结果显示如下:

3、pyvista库显示点云

如果觉得vtk有点复杂,那pyvista绝对是你的“入门好朋友”!它是基于vtk封装的Python库,语法更简洁,不用写一堆繁琐代码,新手也能快速上手,轻松画出漂亮的点云~

https://docs.pyvista.org/examples/00-load/create-point-cloud.html

安装库如下:

pip install pyvista

下面是一段python + pyvista绘制点云代码示例,简单几行就能搞定~

# python + pyvista绘制点云代码示例
import pyvista as pv
import numpy as np

# 1. 生成模拟点云数据(1000个3D点,可替换为自己的点云文件)
n_points = 1000
xyz = np.random.rand(n_points, 3) * 20 - 10# 生成[-10,10]范围内的随机点

# 2. 创建点云对象
point_cloud = pv.PolyData(xyz)

# 3. 给点云添加随机颜色(增加可视化效果)
point_cloud['Random Colors'] = np.random.rand(n_points, 3)

# 4. 绘制点云
plotter = pv.Plotter()
# 添加点云,设置点大小
plotter.add_mesh(point_cloud, point_size=5, render_points_as_spheres=True)
# 设置背景色
plotter.background_color = 'lightgray'
# 显示坐标轴
plotter.add_axes()
# 启动交互窗口
plotter.show()

代码运行后结果显示如下:

4、PCL库显示点云

Point Cloud Library(PCL)可是点云处理领域的“大佬”!虽然它是C++编写的开源库,但咱们可以通过Python接口调用,功能超级强大,不管是点云滤波、分割还是配准,都能轻松拿捏,适合进阶玩家~

https://github.com/PointCloudLibrary/pcl/releases https://pointclouds.org/

  • 尝试安装pclpy库如下:
pip install pclpy

结果报错如下:

  • 尝试安装python-pcl库如下:
pip install python-pcl

结果还是报错如下:算了pcl的python库都失效了,继续下一个点云库。

5、Open3D库显示点云

Open3D和PCL堪称“点云双雄”!作为后起之秀,它对Python的支持更友好,语法简洁,可视化效果也更细腻,虽然算法数量不如PCL多,但日常点云绘制、处理完全够用,新手进阶都合适~

http://www.open3d.org/docs/release/

安装库如下:

pip install open3d

下面是一段python + Open3D库绘制点云代码示例,上手超简单~

# python + Open3D库绘制点云代码示例
import open3d as o3d
import numpy as np

# 1. 生成模拟点云数据(1000个3D点)
n_points = 1000
xyz = np.random.rand(n_points, 3) * 20 - 10# 随机点坐标
colors = np.random.rand(n_points, 3)  # 随机颜色(RGB)

# 2. 创建Open3D点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(xyz)
pcd.colors = o3d.utility.Vector3dVector(colors)

# 3. 可视化点云
o3d.visualization.draw_geometries([pcd], window_name="Open3D Point Cloud", width=800, height=600)

代码运行后结果显示如下:

6、Qt库显示点云

想做带界面的点云可视化程序?Qt安排!通过QVTKWideget模块,结合VTK和PCL,就能打造专属的点云可视化界面,既有Qt的美观界面,又有强大的点云处理能力,适合做项目开发~

https://vtk.org/doc/release/7.1/html/classQVTKWidget.html 安装库如下:

pip install PyQt5 vtk

下面是一段python + pyqt5库绘制点云代码示例,需要先安装pyqt5和pyqt5-vtk库~

# python + pyqt5库绘制点云代码示例
import sys
import vtk
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor

classPointCloudWindow(QMainWindow):
def__init__(self):
        super().__init__()
        self.setWindowTitle("Qt + VTK 点云可视化")
        self.setGeometry(100, 100, 800, 600)

# 1. 创建主widget和布局
        self.main_widget = QWidget()
        self.setCentralWidget(self.main_widget)
        self.layout = QVBoxLayout(self.main_widget)

# 2. 创建VTK渲染窗口部件
        self.vtk_widget = QVTKRenderWindowInteractor(self.main_widget)
        self.layout.addWidget(self.vtk_widget)

# 3. 初始化VTK渲染器
        self.renderer = vtk.vtkRenderer()
        self.vtk_widget.GetRenderWindow().AddRenderer(self.renderer)
        self.interactor = self.vtk_widget.GetRenderWindow().GetInteractor()

# 4. 生成点云数据并添加到渲染器
        self.create_point_cloud()

defcreate_point_cloud(self):
# 生成1000个随机点云
        points = vtk.vtkPoints()
        vertices = vtk.vtkCellArray()
        colors = vtk.vtkUnsignedCharArray()
        colors.SetNumberOfComponents(3)
        colors.SetName("Colors")
import random
for i in range(1000):
            x = random.uniform(-10, 10)
            y = random.uniform(-10, 10)
            z = random.uniform(-10, 10)
            pid = points.InsertNextPoint(x, y, z)
            vertices.InsertNextCell(1)
            vertices.InsertCellPoint(pid)
            colors.InsertNextTuple3(random.randint(0,255), random.randint(0,255), random.randint(0,255))

# 创建点云数据集
        polydata = vtk.vtkPolyData()
        polydata.SetPoints(points)
        polydata.SetVerts(vertices)
        polydata.GetPointData().SetScalars(colors)

# 渲染设置
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputData(polydata)
        mapper.SetScalarModeToUsePointData()
        mapper.SetScalarRange(0, 255)

        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetPointSize(5)
        actor.GetProperty().SetRepresentationToPoints()
        actor.GetProperty().SetColor(1, 1, 1)
        actor.GetProperty().SetAmbient(1.0)
        actor.GetProperty().SetDiffuse(0.0)
        actor.GetProperty().SetSpecular(0.0)

        self.renderer.AddActor(actor)
        self.renderer.SetBackground(0.1, 0.1, 0.1)
        self.renderer.ResetCamera()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PointCloudWindow()
    window.show()
    window.interactor.Initialize()
    sys.exit(app.exec_())

代码运行后结果显示如下:

7、matlab库显示点云

除了Python,Matlab也是点云处理的“好帮手”!自带强大的点云处理工具箱,读取、显示点云一步到位,语法简洁,适合习惯用Matlab做数据处理的小伙伴,还能轻松实现点云重建与三角剖分~

https://ww2.mathworks.cn/help/vision/ref/pcread.html

https://ww2.mathworks.cn/help/vision/point-cloud-processing.html?s_tid=CRUX_lftnav

ptCloud = pcread(filename) 从PLY、PCD读取指定路径的点云。反回一个pointCloud对象。
pcshow(ptCloud)
pcshow(xyzPoints)
pcshow(xyzPoints,C)
pcshow(filename)
pcshow(___,Name,Value)
ax = pcshow(___)

聊完各种库的点云绘制方法,戈戈笑着对狄狄和小沐说:“这就像扒上了点云技术的井沿,总算看清了它的模样,也没那么难嘛!”小沐点头:“是啊,一步步尝试,总能学会。”狄狄打趣:“看来这盘‘菜’,咱们还是能吃上的!”二人相视一笑。

后续

如果您觉得这些文字有一点点用处,请给作者点个赞或关个注;╮( ̄▽ ̄)╭
如果您有技术问题探讨,评论处留言。//(ㄒoㄒ)//
谢谢各位童鞋们啦( ´ ▽ ` )ノ ( ´ ▽ `` )っ!
更多精彩文章详见:
1、微信公众号:杨小羊爱阅读
2、CSDN博客:爱看书的小沐

最新文章

随机文章