利用win32gui
- 利用win32gui.FindWindowEx()寻找名为Open3d的窗口
- 将寻找的窗口绑定到QtGui.QWindow并创建windowcontainer
- 最后将windowcontainer加入到layout中
from PySide2 import QtWidgets, QtGui,QtCore
import open3d as o3d
import win32gui
import sys
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
widget = QtWidgets.QWidget()
layout = QtWidgets.QGridLayout(widget)
self.setCentralWidget(widget)
pcd = o3d.io.read_point_cloud("example.pcd")
self.vis = o3d.visualization.Visualizer()
self.vis.create_window()
self.vis.add_geometry(pcd)
hwnd = win32gui.FindWindowEx(0, 0, None, "Open3D")
self.window = QtGui.QWindow.fromWinId(hwnd)
self.windowcontainer = self.createWindowContainer(self.window, widget)
layout.addWidget(self.windowcontainer, 0, 0)
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_vis)
timer.start(1)
def update_vis(self):
self.vis.poll_events()
self.vis.update_renderer()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = MainWindow()
form.setWindowTitle('o3d Embed')
form.setGeometry(100, 100, 600, 500)
form.show()
sys.exit(app.exec_())
利用pyqtgraph显示点云
- 创建GLViewWidget,并将GLViewWidget加入到pyqt的layout中
- 使用 gl.GLScatterPlotItem散点图的形式显示点云,并加入到GLViewWidget中
- 需要对处理的点云进行可视化时,只需要clear以下GLViewWidget,并加入新的散点图即可
from PyQt5 import QtWidgets, uic
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import open3d as o3d
import pyqtgraph.opengl as gl
import sys
import random
import copy
from mainwindow_rc import Ui_MainWindow
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QFileDialog
from pyqtgraph.opengl import GLViewWidget
from PyQt5.QtGui import QIcon
class open3d_software(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(open3d_software, self).__init__()
self.setupUi(self)
self.setWindowIcon(QIcon("Icons/ic_pride.ico"))
self.actionread.triggered.connect(self.read_pointcloud)
self.actionsave.triggered.connect(self.save_pointcloud)
self.actionquit.triggered.connect(self.close)
self.graphicsView = GLViewWidget(self)
self.gridLayout.addWidget(self.graphicsView)
self.graphicsView.setWindowTitle('test')
self.graphicsView.setBackgroundColor(143, 153, 159)
def read_pointcloud(self):
fileName, filetype = QFileDialog.getOpenFileName(self, "请选择点云:", '.', "All Files(*);;")
if fileName != '':
self.pcd = o3d.io.read_point_cloud(fileName)
pos_view=self.pcd.get_center()
print(pos_view)
self.textBrowser.clear()
np_points = np.asarray(self.pcd.points)
self.textBrowser.append("点云数量:" + str(int(np_points.size/3)))
self.graphicsView.clear()
plot = gl.GLScatterPlotItem()
plot.setData(pos=np_points, color=(1, 1, 1, 1), size=0.005, pxMode=True)
self.graphicsView.addItem(plot)
self.graphicsView.setCameraPosition(QtGui.QVector3D(pos_view[0],pos_view[1],pos_view[2]))
def save_pointcloud(self):
fileName, filetype = QFileDialog.getSaveFileName(self, "文件保存:", '.', "All Files(*);;")
if fileName != '':
o3d.io.write_point_cloud(fileName, self.pcd)
app = QApplication(sys.argv)
a = open3d_software()
a.setWindowTitle("Open3D software")
a.show()
sys.exit(app.exec_())