Open3D-GUI系列教程(一)创建一个Open3D应用窗口

这篇具有很好参考价值的文章主要介绍了Open3D-GUI系列教程(一)创建一个Open3D应用窗口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本人菜狗一枚,第一次写文章,python懂的也不多,肯定有很多表述存在问题,如有错误请大佬们不吝赐教。

整个open3d的gui我是照着源码里的示例和官方文档摸出来的,因为确实很少有关于这个的教程,官方也没给。所以我顺便整理分享一下。

Open3D官网

官方文档

open3d版本:0.14.1


Open3D安装:

闲话少说,直接开整。

Pip

pip install open3d

Conda

conda install -c open3d-admin -c conda-forge open3d

第一个Open3D窗口

Open3d提供了很多种可视化方案,同时也提供了一个open3d.visualization.gui模块和open3d.visualization.rendering模块用来快速构建小应用。

1. 导入相应模块

import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
  • o3d提供所有的Open3d模块,包括常用的模型加载(o3d.io),几何和数据结构(o3d.geometry)等。

  • gui提供了应用的全局实例(gui.Application.instance),和全部可用的控件。

  • rendering提供了场景模型渲染的相关部分。

2. 初始化应用实例并创建窗口

我们定义一个应用类,用来创建界面,界面布局和相应事件等设置都应该在__init__中完成。

class App:
    def __init__(self):
        # 初始化实例
       	gui.Application.instance.initialize()	
        
        # 创建主窗口
        self.window = gui.Application.instance.create_window('My First Window', 800, 600)
        
        # 创建显示场景
        self.scene = gui.SceneWidget()
        self.scene.scene = rendering.Open3DScene(self.window.renderer)
        
        # 将场景添加到窗口中
        self.window.add_child(self.scene)
        
        # 创建一个球
        sphere = o3d.geometry.TriangleMesh.create_sphere()
        sphere.paint_uniform_color([0.0, 1.0, 1.0])
        sphere.compute_vertex_normals()
        material = rendering.MaterialRecord()
        material.shader = 'defaultLit'
        
        # 将球加入场景中渲染
        self.scene.scene.add_geometry("Sphere", sphere, material)
        
        # 设置相机属性
        bounds = sphere.get_axis_aligned_bounding_box()
        self.scene.setup_camera(60, bounds, bounds.get_center())
	
    def run(self):
        gui.Application.instance.run()

if __name__ == "__main__":
    app = App()
    app.run()

2.1 初始化

当我们想要使用gui模块创建一个应用程序时,在使用任何控件之前,必须先初始化全局应用单例gui.Application.instance

gui.Application.instance.initialize()	

初始化有两种方式,其中的一种必须首先被调用。

  1. initialize(self: gui.Application) -> None
    • 使用默认的资源初始化。
  2. initialize(self: gui.Application, arg0: str) -> None
    • arg0是资源文件路径(resources),用该资源初始化。

2.2 创建窗口

当应用初始化后,我们就可以通过全局应用单例创建窗口了,我们将窗口命名为”My First Window“。

 self.window = gui.Application.instance.create_window('My First Window', 800, 600)

该函数原型是:

create_window(self: open3d.cpu.pybind.visualization.gui.Application, title: str = ‘’, width: int = - 1, height: int = - 1, x: int = - 1, y: int = - 1, flags: int = 0) → open3d::visualization::gui::PyWindow

  • title是应用窗口名称,即左上角的title。
  • width和height是窗口大小。
  • x, y和flag是可选的。(我也不晓得是啥)

该函数返回一个应用窗口。

2.3 添加场景

有了窗口之后,我们可以向窗口里添加一个组件gui.SceneWidget,这个控件是用来展示3D模型的场景。

 self.scene = gui.SceneWidget()
 self.scene.scene = rendering.Open3DScene(self.window.renderer)

gui.SceneWidget()返回一个空的组件,所以我们必须为组件添加一个渲染器。这个渲染器可以直接用主窗口的渲染器(即self.window.renderer)来初始化。

之后,我们将创建的控件作为主窗口的子控件添加到应用中。通过调用窗口的add_child()完成。

 self.window.add_child(self.scene)

2.4 添加模型

在之前的步骤中,我们创建了一个空的场景,我们可以向场景中添加不同的模型进行渲染。每个模型都有一个对应的材质(Material),用来决定模型的颜色、纹理、着色模型、光照等。

这里我们创建一个在圆心在原点(0,0,0)的球和对应材质。

material.shader= 'defaultLit'表示使用默认的光照模型进行着色。由于光照模型需要法向量信息,所以我们需要计算球顶点的法向量。

sphere = o3d.geometry.TriangleMesh.create_sphere()
sphere.paint_uniform_color([0.0, 1.0, 1.0])
sphere.compute_vertex_normals()
material = rendering.Material()
material.shader = 'defaultLit'

准备好模型就可以将其添加到场景中了。

 self.scene.scene.add_geometry("Sphere", sphere, material)
  • 第一个参数是模型的名字,之后可以用这个唯一的名字操作相应的模型(如隐藏该模型)。
  • 第二个参数是模型,类型是o3d.geometry.Geometry3Do3d.geometry.Geometry,
  • 第三个参数是模型材质。

2.5 相机属性

场景中有了模型,我们需要设置相机来观察模型。

bounds = sphere.get_axis_aligned_bounding_box()
self.scene.setup_camera(60, bounds, bounds.get_center())

设置场景的相机通过setup_camera()实现,其原型之一如下:

setup_camera(field_of_view, model_bounds, center_of_rotation)

  • 第一个参数决定视野范围FOV;
  • 第二个参数是模型的包围盒,可以通过get_axis_aligned_bounding_box来获得;
  • 第三个参数是摄像机的旋转中心;

2.6 循环事件

此时我们已经创建好了窗口,添加了模型,要让应用开始运行,只需要让全局单例跑起来。

gui.Application.instance.run()

这样应用就会一直运行直到关闭,而不会闪一下就结束。

3.运行结果

运行这个程序,你将会得到一个可以旋转的青色球。

Open3D-GUI系列教程(一)创建一个Open3D应用窗口文章来源地址https://www.toymoban.com/news/detail-411964.html

到了这里,关于Open3D-GUI系列教程(一)创建一个Open3D应用窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Open3D点云数据处理(一):VSCode配置python,并安装open3d教程

    专栏地址:https://blog.csdn.net/weixin_46098577/category_11392993.html 在很久很久以前,我写过这么一篇博客,讲的是open3d点云处理的基本方法。👇 当时是 PyCharm + Anaconda + python3.8 + open3d 0.13 已经是2023年了,现在有了全新版本。目前python由当年的3.8更新到了3.11版本,open3d也从0.13来到了

    2024年02月07日
    浏览(59)
  • 【Open3D 实现点云拼接】——将两个点云合并成一个

    【Open3D 实现点云拼接】——将两个点云合并成一个 点云拼接是三维重建和场景重建中的重要一步,如何高效、准确地将两个点云进行拼接是一个挑战。Open3D是一个专业的开源库,提供了丰富的三维算法和工具,其中支持点云的读取、处理和可视化。本文将介绍如何使用Open

    2024年02月13日
    浏览(32)
  • open3d学习教程1--点云对象PointCloud

    点云简单来说就是3d坐标下一个个点组成的数据,每个点可以包含x,y,z,颜色、分类值、强度值、时间等等信息。点云是3d数据的表示形式之一。 open3d中用来表示点云的数据结构。pointcloud对象包含了很多处理点云的成员方法,如点云体素下采样,点云上色等等。 pointcloud的静态

    2023年04月08日
    浏览(36)
  • 【点云处理教程】00计算机视觉的Open3D简介

            Open3D 是一个开源库,使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式,例如 .ply、.obj、.stl 和 .xyz,并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广泛应用于机器人、增强现实和自

    2024年02月14日
    浏览(45)
  • 基于Python的Open3D库进行点云聚类(详细教程)

    基于Python的Open3D库进行点云聚类(详细教程) 随着3D技术的不断发展,点云处理已成为越来越重要的研究领域之一。而点云聚类作为其中的一个热门问题,已经成为广大3D技术工作者必须掌握的技能之一。本文将介绍如何使用Python中的Open3D库实现点云聚类,并给出详细的代码

    2024年02月09日
    浏览(35)
  • open3d教程(二):可视化三维模型,并转换成点云(Python版本)

    可以自己用建模软件建立一个模型 从free3d免费下载 open3d.visualization. draw_geometries 参数: geometry_list ( List[open3d.geometry.Geometry]) : 要可视化的几何体列表. window_name( str ,  optional ,  default=\\\'Open3D\\\'): 展示模型的可视化窗口名称,默认是Open3d. width: 

    2024年02月11日
    浏览(46)
  • python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学

    Open3D是目前python中可用的用于 3D 数据处理的现代库,可以对点云、网格等三维数据进行读取、采样、配准、可视化等操作。其中对点云等三维模型进行可视化的功能在Python中显得非常方便。 在通过对官方文档的研究之后作者发现在Open3D的多种可视化函数中出现了返回所选点

    2024年02月02日
    浏览(61)
  • Pytorch1.7复现PointNet++点云分割(含Open3D可视化)(文末有一个自己做的书缝识别项目代码)

      毕设需要,复现一下PointNet++的对象分类、零件分割和场景分割,找点灵感和思路,做个踩坑记录。 https://github.com/yanx27/Pointnet_Pointnet2_pytorch   我的运行环境是pytorch1.7+cuda11.0。   PointNet++代码能实现3D对象分类、对象零件分割和语义场景分割。 对象分类   下载数据

    2023年04月15日
    浏览(82)
  • 【Open3D】如何在CMake/C++中调用Open3D

    qquad Open3D是点云的开源处理库,支持Python或C++。其Python已有较全的教程,也可以直接使用 pip install open3d 直接进行安装,而若想在C++中调用Open3D则麻烦一些,需要满足以下条件: Open3D git源代码(本教程针对0.16.1的版本) CMake = 3.20 clang = 7 分为以下几步进行: 下载Open3D源代码

    2023年04月18日
    浏览(46)
  • 基于Open3D的点云处理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日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包