Open3D与PyQT联动的两种方法

利用win32gui

  1. 利用win32gui.FindWindowEx()寻找名为Open3d的窗口
  2. 将寻找的窗口绑定到QtGui.QWindow并创建windowcontainer
  3. 最后将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.update_geometry()
        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显示点云

  1. 创建GLViewWidget,并将GLViewWidget加入到pyqt的layout中
  2. 使用 gl.GLScatterPlotItem散点图的形式显示点云,并加入到GLViewWidget中
  3. 需要对处理的点云进行可视化时,只需要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

# ---------------------registration--------------
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):
        # print("test well")
        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()
            # 获取 Numpy 数组
            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)  # 0.05表示点的大小
            # 显示点云
            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_())
  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值