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

点云可不是什么“高冷技术”,说白了就是在同一空间参考系下,给物体表面“拍”无数个采样点,这些点凑在一起就形成了物体的三维“轮廓”~ 每个点都藏着不少秘密,包括三维坐标(X,Y,Z)、颜色、分类值、强度值等,海量这样的点集合,就是我们要摆弄的“点云(Point Cloud)”,不管是3D建模还是物体识别,都离不开它!
想实现点云可视化,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()
代码运行后结果显示如下:
如果觉得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()
代码运行后结果显示如下:
Point Cloud Library(PCL)可是点云处理领域的“大佬”!虽然它是C++编写的开源库,但咱们可以通过Python接口调用,功能超级强大,不管是点云滤波、分割还是配准,都能轻松拿捏,适合进阶玩家~
https://github.com/PointCloudLibrary/pcl/releases https://pointclouds.org/

pip install pclpy
结果报错如下:
pip install python-pcl
结果还是报错如下:
算了pcl的python库都失效了,继续下一个点云库。
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)
代码运行后结果显示如下:
想做带界面的点云可视化程序?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_())
代码运行后结果显示如下:
除了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博客:爱看书的小沐