PyQt+GLViewWidget显示点云
import sys
import numpy as np
import pyqtgraph.opengl as gl
from PyQt5.QtWidgets import *
from pyqtgraph.opengl import GLViewWidget
class DemoWidget(QWidget):
def __init__(self, parent=None):
super(DemoWidget, self).__init__(parent)
self.graphicsView = GLViewWidget(self)
self.pushButton = QPushButton(self)
self.pushButton.setText("PushButton")
self.pushButton.clicked.connect(self.showCloud)
self.verticalLayout = QVBoxLayout(self)
self.verticalLayout.addWidget(self.graphicsView)
self.verticalLayout.addWidget(self.pushButton)
self.setLayout(self.verticalLayout)
def showCloud(self):
fileName, filetype = QFileDialog.getOpenFileName(self, "请选择点云:", '.', "cloud Files(*pcd *ply)")
if fileName != '':
import open3d as o3d
pcd = o3d.io.read_point_cloud(fileName)
# import pcl
# pcd = pcl.load(fileName)
np_points = np.asarray(pcd.points) #获取Numpy数组
plot = gl.GLScatterPlotItem() #创建显示对象
plot.setData(pos=np_points, color=(1, 1, 1, 1), size=0.001, pxMode=False) #设置显示数据
self.graphicsView.addItem(plot) #显示点云
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoWidget()
window.show()
sys.exit(app.exec_())
PyQt+VTK显示点云
import sys
import vtk
import numpy as np
from PyQt5.QtWidgets import *
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from vtkmodules.util.numpy_support import numpy_to_vtk
class VTKWidget(QVTKRenderWindowInteractor):
def __init__(self, parent=None):
super(VTKWidget, self).__init__(parent)
self.Initialize() # 初始化VTK渲染窗口
self.Start() # 开始渲染循环
self.GetRenderWindow().GetInteractor().SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
self.renderer = vtk.vtkRenderer() # 创建渲染器和渲染窗口
self.GetRenderWindow().AddRenderer(self.renderer)
def show_cloud(self, cloud):
points = vtk.vtkPoints()
points.SetData(numpy_to_vtk(np.asarray(cloud.points)))
polydata = vtk.vtkPolyData()
polydata.SetPoints(points) # 设置点坐标
vertex = vtk.vtkVertexGlyphFilter()
vertex.SetInputData(polydata)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(vertex.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
self.renderer.AddActor(actor) # 将点云添加到渲染器中
self.renderer.ResetCamera()
class DemoWidget(QWidget):
def __init__(self, parent=None):
super(DemoWidget, self).__init__(parent)
self.pushButton = QPushButton(self)
self.pushButton.setText("PushButton")
self.pushButton.clicked.connect(self.showCloud)
self.verticalLayout = QVBoxLayout(self)
self.vtk_widget = VTKWidget()
self.verticalLayout.addWidget(self.vtk_widget)
self.verticalLayout.addWidget(self.pushButton)
self.setLayout(self.verticalLayout)
def showCloud(self):
fileName, filetype = QFileDialog.getOpenFileName(self, "请选择点云:", '.', "cloud Files(*pcd *ply)")
if fileName != '':
import open3d as o3d
pcd = o3d.io.read_point_cloud(fileName)
# import pcl
# pcd = pcl.load(fileName)
self.vtk_widget.show_cloud(pcd)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = DemoWidget()
window.show()
sys.exit(app.exec_())
其中点云的读取可以使用open3d或者pcl库,只有导包以及读取代码的差别(见注释部分)。
vtk比opengl 的实现复杂一些,但是vtk的接口功能更加丰富(vtk是基于opengl开发的)。