国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形

這篇具有很好參考價(jià)值的文章主要介紹了在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?本文方法來自:PYQT5內(nèi)嵌外部exe程序(win7)_pyqt5嵌入外部窗口_這杯可樂有點(diǎn)甜的博客-CSDN博客

open3d在繪制點(diǎn)云等圖形時(shí),通常需要?jiǎng)?chuàng)建一個(gè)窗口。本文實(shí)現(xiàn)了將open3d創(chuàng)建的窗口顯示在Qt窗口內(nèi),以便于后續(xù)通過Qt控件和槽函數(shù)調(diào)用open3d強(qiáng)大的繪圖和處理功能。

運(yùn)行結(jié)果如下圖所示:

在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形

?

實(shí)現(xiàn)過程:

1.首先,導(dǎo)入需要的庫(kù):

import sys
import open3d as o3d
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget
from PyQt5.QtGui import QWindow
from PyQt5.QtCore import QTimer
import win32gui

其中win32gui為Pywin32庫(kù)。

2.設(shè)計(jì)界面:

用Qt?Designer繪制界面,如圖:

在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形

?保存并編譯.ui文件,得到對(duì)應(yīng)的.py文件。

3.嵌入窗口:

新建一個(gè)python文件,繼承剛剛所寫的界面的類。

創(chuàng)建一個(gè)open3d的Visualizer類的實(shí)例vis,并創(chuàng)建窗口:

class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = Ui_display_test.Ui_MainWindow()
        self.ui.setupUi(self)
        self.vis = o3d.visualization.Visualizer()
        self.vis.create_window()
        

添加斷點(diǎn),或者使用vis.run()使窗口保持顯示,在Visual Studio安裝目錄的Community\Common7\Tools找到并打開Spy++,按Ctrl+F,將“查找程序工具”拖動(dòng)到打開的open3d窗口上,如圖:在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形

得到窗體類名為GLFW30。

通過Pywin32和PyQt5.QtGui?找到這個(gè)類對(duì)應(yīng)的窗口,并獲得對(duì)應(yīng)WinId:

        self.winid = win32gui.FindWindow('GLFW30',None)
        self.sub_window = QWindow.fromWinId(self.winid)

創(chuàng)建WindowContainer,將窗口放入其中,在將WindowContainer添加到Qt布局中:

        self.displayer = QWidget.createWindowContainer(self.sub_window)
        self.ui.grid_display.addWidget(self.displayer)

此時(shí)open3d窗口已經(jīng)嵌入Qt窗口中。

4.加載點(diǎn)云,測(cè)試效果:

根據(jù)open3d文檔,o3d.visualization.draw_geometries([pcd])方法可以用以下代碼替代實(shí)現(xiàn):

def custom_draw_geometry(pcd):
    # The following code achieves the same effect as:
    # o3d.visualization.draw_geometries([pcd])
    vis = o3d.visualization.Visualizer()
    vis.create_window()
    vis.add_geometry(pcd)
    vis.run()
    vis.destroy_window()

因此,添加函數(shù):

    def draw_test(self):
        pcd = o3d.io.read_point_cloud(r'../material/bun000.pcd')    #點(diǎn)云路徑
        self.vis.add_geometry(pcd)
        self.vis.run()

并在析構(gòu)函數(shù)添加

self.vis.destroy_window()

5.修改為非阻塞顯示方式:

上面的代碼雖然能正常顯示點(diǎn)云,但是由于vis.run()是阻塞方式運(yùn)行的,所以在窗口關(guān)閉時(shí)destroy_window()并不能被執(zhí)行,此時(shí)會(huì)導(dǎo)致GLFW一直報(bào)錯(cuò),程序無法停止運(yùn)行。

在open3d文檔中,有:

代碼的下一部分是本教程的核心。update_geometry通知vis相關(guān)的幾何圖形已經(jīng)更新。最后,可視化器通過調(diào)用poll_eventsupdate_renderer渲染一個(gè)新幀。在任何for循環(huán)迭代之后,destroy_window將關(guān)閉窗口。

?將vis.run()替換為:

while True:
        self.vis.poll_events()
        self.vis.update_renderer()

實(shí)現(xiàn)的效果與vis.run()相同。

添加一個(gè)定時(shí)器,設(shè)置定時(shí)器為20毫秒,將這兩行代碼寫到定時(shí)器信號(hào)對(duì)應(yīng)的槽函數(shù)中:

    def __init__:
        …………
        self.clock = QTimer(self)
        self.clock.timeout.connect(self.draw_update)
        self.clock.start(20)
        …………

    def draw_update(self):
        self.vis.poll_events()
        self.vis.update_renderer()      

就實(shí)現(xiàn)了每20ms刷新一次顯示,同時(shí)不阻塞程序運(yùn)行。

完整代碼:

display_test.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>828</width>
    <height>608</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout" stretch="3">
      <item>
       <layout class="QGridLayout" name="grid_display">
        <property name="sizeConstraint">
         <enum>QLayout::SetDefaultConstraint</enum>
        </property>
       </layout>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>828</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Ui_display_test.py,由display_test.ui編譯生成:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'd:\personal programs\gradesign\CSDN文章用\display_test.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(828, 608)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.grid_display = QtWidgets.QGridLayout()
        self.grid_display.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
        self.grid_display.setObjectName("grid_display")
        self.horizontalLayout.addLayout(self.grid_display)
        self.horizontalLayout.setStretch(0, 3)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 828, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

displaytest.py:文章來源地址http://www.zghlxwxcb.cn/news/detail-461173.html

import sys
import open3d as o3d
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget
from PyQt5.QtGui import QWindow
from PyQt5.QtCore import QTimer
import win32gui
import Ui_display_test

class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = Ui_display_test.Ui_MainWindow()
        self.ui.setupUi(self)
        self.vis = o3d.visualization.Visualizer()
        self.vis.create_window(visible=False)  #visible=False窗口不顯示,避免啟動(dòng)時(shí)一閃而過
        self.winid = win32gui.FindWindow('GLFW30',None)
        self.sub_window = QWindow.fromWinId(self.winid)
        self.displayer = QWidget.createWindowContainer(self.sub_window)
        self.ui.grid_display.addWidget(self.displayer)
        self.clock = QTimer(self)
        self.clock.timeout.connect(self.draw_update)
        self.clock.start(20)
        self.draw_test()


    def draw_test(self):
        pcd = o3d.io.read_point_cloud(r'../material/bun000.pcd')    #點(diǎn)云路徑
        self.vis.add_geometry(pcd)
        self.vis.update_geometry(pcd)
        
    def draw_update(self):
        self.vis.poll_events()
        self.vis.update_renderer()      

    def __del__(self):
        #self.clock.stop()      #這一行其實(shí)并不需要
        self.vis.destroy_window()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

到了這里,關(guān)于在PyQt5窗口中嵌入open3d窗口顯示點(diǎn)云圖形的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python: 用open3D庫(kù),連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

    Python: 用open3D庫(kù),連續(xù)多幀顯示點(diǎn)云(查看localization pose的好壞)

    連續(xù)多幀顯示點(diǎn)云,需要 點(diǎn)云文件 和 定位信息(IMU慣導(dǎo)信息),我這里是從bag包里面自己解析出來的定位信息,因?yàn)槭亲约簩懙墓?jié)點(diǎn),所以直接從代碼里面跑出來的,不是ros官方定義的,所以沒有用官方給出的方法 總體思路: 將每一幀點(diǎn)云和旋轉(zhuǎn)矩陣進(jìn)行 時(shí)間對(duì)齊 -----

    2023年04月11日
    瀏覽(171)
  • 第二章 python-pcl、open3d讀取、顯示pcd、bin等格式點(diǎn)云數(shù)據(jù)

    第二章 python-pcl、open3d讀取、顯示pcd、bin等格式點(diǎn)云數(shù)據(jù)

    點(diǎn)云數(shù)據(jù)實(shí)際上就是許多組點(diǎn)的集合,每個(gè)點(diǎn)由{x,y,z}組成。當(dāng)然理論上的只包含有3D坐標(biāo)。 實(shí)際激光雷達(dá)獲取的點(diǎn)云數(shù)據(jù)還會(huì)包含強(qiáng)度、反射率等等。但我們一般只用提取{x,y,z}來處理即可。 點(diǎn)云數(shù)據(jù)相比于其他傳感器數(shù)據(jù)的核心優(yōu)勢(shì)就是在于 精準(zhǔn)的深度信息??上Й@取具體

    2024年01月16日
    瀏覽(26)
  • 基于Open3D的點(diǎn)云處理17-Open3d的C++版本

    基于Open3D的點(diǎn)云處理17-Open3d的C++版本

    http://www.open3d.org/docs/latest/cpp_api.html http://www.open3d.org/docs/latest/getting_started.html#c http://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-project https://github.com/isl-org/open3d-cmake-find-package https://github.com/isl-org/open3d-cmake-external-project https://github.com/isl-org/Open3D/releases Note: -DBUILD_SHARED_LIBS

    2024年02月09日
    瀏覽(47)
  • Open3D點(diǎn)云處理

    Open3D點(diǎn)云處理

    Open3D is an open-source library that supports rapid development of software that deals with 3D data. The Open3D frontend exposes a set of carefully selected data structures and algorithms in both C++ and Python. The backend is highly optimized and is set up for parallelization. Open3D是一個(gè)支持3D數(shù)據(jù)處理軟件快速開發(fā)的開源庫(kù),在前端提供

    2023年04月17日
    瀏覽(25)
  • open3d點(diǎn)云平移

    open3d點(diǎn)云平移

    功能簡(jiǎn)介 open3d中點(diǎn)云的平移函數(shù)為:pcd.translate((tx, ty, tz), relative=True)。當(dāng)relative為True時(shí),(tx, ty, tz)表示點(diǎn)云平移的相對(duì)尺度,也就是平移了多少距離。當(dāng)relative為False時(shí),(tx, ty, tz)表示點(diǎn)云中心(質(zhì)心)平移到的指定位置。質(zhì)心可以坐標(biāo)可以通過pcd.get_center()得到。 代碼

    2024年01月22日
    瀏覽(42)
  • Open3d點(diǎn)云對(duì)象詳解

    Open3d點(diǎn)云對(duì)象詳解

    PointCloud 是open3d中用于點(diǎn)云處理的類,封裝了包括幾何變換、數(shù)據(jù)濾波、聚類分割等一系列實(shí)用算法。如無特別說明,本例中所有例程均基于斯坦福兔子的點(diǎn)云模型,下載地址:斯坦福標(biāo)準(zhǔn)模型 讀取和清除點(diǎn)云 一般點(diǎn)云數(shù)據(jù)的讀取方法屬于 open3d.io 的內(nèi)容,但點(diǎn)云類也提供了

    2023年04月19日
    瀏覽(52)
  • Open3D點(diǎn)云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    Open3D點(diǎn)云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    專欄地址:https://blog.csdn.net/weixin_46098577/category_11392993.html 在很久很久以前,我寫過這么一篇博客,講的是open3d點(diǎn)云處理的基本方法。?? 當(dāng)時(shí)是 PyCharm + Anaconda + python3.8 + open3d 0.13 已經(jīng)是2023年了,現(xiàn)在有了全新版本。目前python由當(dāng)年的3.8更新到了3.11版本,open3d也從0.13來到了

    2024年02月07日
    瀏覽(37)
  • open3d操作.ply文件(點(diǎn)云)

    open3d操作.ply文件(點(diǎn)云)

    讀取.ply文件

    2024年02月14日
    瀏覽(24)
  • Open3D 詳解:點(diǎn)云裁剪實(shí)戰(zhàn)

    Open3D 詳解:點(diǎn)云裁剪實(shí)戰(zhàn) 在進(jìn)行點(diǎn)云處理時(shí),經(jīng)常需要對(duì)點(diǎn)云進(jìn)行裁剪操作,以去除無用的噪點(diǎn)或僅保留感興趣區(qū)域內(nèi)的點(diǎn)云。Open3D 是一個(gè)廣泛應(yīng)用于三維數(shù)據(jù)處理的開源庫(kù),提供了簡(jiǎn)單易用的點(diǎn)云裁剪方法。 以下是一個(gè)基于 Open3D 的點(diǎn)云裁剪實(shí)戰(zhàn)例程。首先,我們導(dǎo)入需

    2024年02月06日
    瀏覽(29)
  • 點(diǎn)云可視化 open3D

    點(diǎn)云可視化 open3D

    禁止轉(zhuǎn)載 Python點(diǎn)云數(shù)據(jù)處理(六)Open3d補(bǔ)充:點(diǎn)云基本處理 - 知乎 https://zhuanlan.zhihu.com/p/353971365?utm_id=0 open3d繪制點(diǎn)云1–單幀點(diǎn)云 - 知乎 https://zhuanlan.zhihu.com/p/591249741 (168條消息) open3D 的使用,pcd可視化,3D bbox可視化,web_visualizer使用等。_CV礦工的博客-CSDN博客 https://blog.csdn.ne

    2024年02月09日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包