通过draw_geometriesdraw_geometries_with_custom_animation函数可以很方便地使用Open3D的可视化功能,一切都可以用GUI完成。在可视化窗口按 h 键,可以看到相关的帮助信息。更多细节:可视化。
本教程重点介绍了更高级的可视化功能,以自定义可视化窗口的行为。请参考/Python/Advanced/customized_visualization.py实现以下例程。

通过Visualizer 类模仿draw_geometries()功能

def custom_draw_geometry(pcd):# 以下代码实现了与以下相同的效果:# o3d.visualization.draw_geometries([pcd])vis = o3d.visualization.Visualizer()vis.create_window()vis.add_geometry(pcd)vis.run()vis.destroy_window()

这个函数实现了与draw_geometries函数同样的功能。

Visualizer类具有几个变量,比如ViewControlRenderOption。以下函数读取储存在json文件中的预定义的RenderOption

def custom_draw_geometry_load_option(pcd):vis = o3d.visualization.Visualizer()vis.create_window()vis.add_geometry(pcd)vis.get_render_option().load_from_json("../../TestData/renderoption.json")vis.run()vis.destroy_window()

改变视角

要去改变相机的视角,必须先获取可视化控件的实例。使用change_field_of_view函数改变视场。

def custom_draw_geometry_with_custom_fov(pcd, fov_step):vis = o3d.visualization.Visualizer()vis.create_window()vis.add_geometry(pcd)ctr = vis.get_view_control()print("Field of view (before changing) %.2f" % ctr.get_field_of_view())ctr.change_field_of_view(step=fov_step)print("Field of view (after changing) %.2f" % ctr.get_field_of_view())vis.run()vis.destroy_window()

视角可以设置为[5,90]度。注意函数change_field_of_view在当前的FoV下添加了指定的FoV。默认的可视化具有60°的FoV。调用以下代码:

custom_draw_geometry_with_custom_fov(pcd, 90.0)

这将会在默认的60°上添加90°的FoV,当超过最大的FoV时,FoV将会被设置为90°。

下面的代码

custom_draw_geometry_with_custom_fov(pcd, -90.0)

将会把FoV设置为5°,因为60 - 90 = -30低于5°。

使用回调函数

def custom_draw_geometry_with_rotation(pcd):def rotate_view(vis):ctr = vis.get_view_control()ctr.rotate(10.0, 0.0)return Falseo3d.visualization.draw_geometries_with_animation_callback([pcd],rotate_view)

函数draw_geometries_with_animation_callback将Python的回调函数rotate_view注册为主循环的空闲函数。当可视化窗口处于空闲状态的时候,他将沿着X轴旋转。这样就定义了动画行为。

def custom_draw_geometry_with_key_callback(pcd):def change_background_to_black(vis):opt = vis.get_render_option()opt.background_color = np.asarray([0, 0, 0])return Falsedef load_render_option(vis):vis.get_render_option().load_from_json("../../TestData/renderoption.json")return Falsedef capture_depth(vis):depth = vis.capture_depth_float_buffer()plt.imshow(np.asarray(depth))plt.show()return Falsedef capture_image(vis):image = vis.capture_screen_float_buffer()plt.imshow(np.asarray(image))plt.show()return Falsekey_to_callback = {}key_to_callback[ord("K")] = change_background_to_blackkey_to_callback[ord("R")] = load_render_optionkey_to_callback[ord(",")] = capture_depthkey_to_callback[ord(".")] = capture_imageo3d.visualization.draw_geometries_with_key_callbacks([pcd], key_to_callback)

回调函数也能够在按键事件产生的时候注册。上面的脚本注册了四个按键。比如按下K键将会把背景设置为黑色。

以自定义的动画捕获图像

def custom_draw_geometry_with_camera_trajectory(pcd):custom_draw_geometry_with_camera_trajectory.index = -1custom_draw_geometry_with_camera_trajectory.trajectory =\o3d.io.read_pinhole_camera_trajectory("../../TestData/camera_trajectory.json")custom_draw_geometry_with_camera_trajectory.vis = o3d.visualization.Visualizer()if not os.path.exists("../../TestData/image/"):os.makedirs("../../TestData/image/")if not os.path.exists("../../TestData/depth/"):os.makedirs("../../TestData/depth/")def move_forward(vis):# This function is called within the o3d.visualization.Visualizer::run() loop# The run loop calls the function, then re-render# So the sequence in this function is to:# 1. Capture frame# 2. index++, check ending criteria# 3. Set camera# 4. (Re-render)ctr = vis.get_view_control()glb = custom_draw_geometry_with_camera_trajectoryif glb.index >= 0:print("Capture image {:05d}".format(glb.index))depth = vis.capture_depth_float_buffer(False)image = vis.capture_screen_float_buffer(False)plt.imsave("../../TestData/depth/{:05d}.png".format(glb.index),\np.asarray(depth), dpi = 1)plt.imsave("../../TestData/image/{:05d}.png".format(glb.index),\np.asarray(image), dpi = 1)#vis.capture_depth_image("depth/{:05d}.png".format(glb.index), False)#vis.capture_screen_image("image/{:05d}.png".format(glb.index), False)glb.index = glb.index + 1if glb.index < len(glb.trajectory.parameters):ctr.convert_from_pinhole_camera_parameters(glb.trajectory.parameters[glb.index])else:custom_draw_geometry_with_camera_trajectory.vis.\register_animation_callback(None)return Falsevis = custom_draw_geometry_with_camera_trajectory.visvis.create_window()vis.add_geometry(pcd)vis.get_render_option().load_from_json("../../TestData/renderoption.json")vis.register_animation_callback(move_forward)vis.run()vis.destroy_window()

这个函数读取了相机轨迹,然后自定义了动画函数move_forward以遍历相机轨迹。在这个函数中,彩色图像和深度图像分别使用Visualizer.capture_depth_float_bufferVisualizer.capture_screen_float_buffer去捕获,然后保存成文件。
捕获的彩色图像序列

捕获的深度图像序列

Open3d之自定义可视化相关推荐

  1. Open3d之交互式可视化

    本篇教程介绍了Open3D的可视化窗口的交互功能. # -*- coding:utf-8 -*-import copy import numpy as np import open3d as o3dd ...

  2. seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot)

    seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot) 目录 seaborn可视化散点图并自定义可视化结果图像的大小(Change ...

  3. python使用matplotlib可视化线图(line plot)、自定义可视化图像的四个边框的色彩、可以分别设置矩形每一条边的色彩(change the axis color)

    python使用matplotlib可视化线图(line plot).自定义可视化图像的四个边框的色彩.可以分别设置矩形每一条边的色彩(change the axis color of a plot ...

  4. R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值、自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)

    R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值.自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N.中位数median.四分位数的间距iqr) 目录

  5. R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色、改变图像(plot)区域的背景色

    R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色.改变图像(plot)区域的背景色 目录

  6. Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)

    Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color) 目录

  7. R语言axis函数自定义可视化的坐标轴刻度线(axis ticks)

    R语言axis函数自定义可视化的坐标轴刻度线(axis ticks) 目录 R语言axis函数自定义可视化的坐标轴刻度线(axis ticks) # 自定义轴刻度

  8. vs 调试 无法加载自定义可视化工具_推荐 5 款好用的REST API工具

    作者 | Marta Krzyk 首发|架构头条 译者 | 王强 策划 | 小智 市面上可用的 REST API 工具选项有很多,我们来看看其中一些开发人员最喜欢的工具. 1 API 定义 Swagg ...

  9. WPF TreeView自定义可视化树样式

    目前项目中效果(没上传,需要的留言) 以下例子 最终效果: TreeView 折叠箭头,带垂直方向.水平方向层级线条(如图) 来看看怎么一步步实现吧~ 补充一点,代码本地试过,现剪切的所以可能部分运行 ...

最新文章

  1. 机器学习者应知的五大深度学习框架
  2. firewall-cmd命令管理防火墙
  3. band math函数_ENVI波段运算(bandmath)运算逻辑及常用运算符详解
  4. Java多线程精讲(非高并发-授课专用)附synchronized
  5. 别名、浅复制与深复制
  6. CVE-2009-3459
  7. windows dc linux,active-directory – Linux AD集成,使用Windows Server 2012 DC时无法登录
  8. 年轻人还在讨论要不要躺平时,阿里已经注册了“躺平”商标
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的酒店预订系统
  10. Python图像处理库PIL的ImageDraw模块之画出四边形
  11. SpringMVC_跟踪请求
  12. 这样的极客大会千万别停!如今中国太需要为技术传道、为极客正名
  13. 使用 python 管理 mysql 开发工具箱 - 2
  14. 敏感词过滤/字符编码
  15. serv-u and hway3.0
  16. 搜索引擎使用的10个技巧
  17. Microsemi Libero SoC 教程1 (Libero开发环境)
  18. 使用List进行分组操作
  19. SDL下播放声音文件
  20. Integrating Factor

热门文章

  1. suse linux rpm 安装
  2. Ubuntu 18安装谷歌浏览器
  3. Shell脚本监控LVS后台服务器存活状态
  4. 通过filebeat、logstash、rsyslog采集nginx日志的几种方式
  5. 免密钥登录linux
  6. 关于ibatis的SQL注入。
  7. 深度 linux支持debian,基于Debian的Linux发行版安装深度音乐及其插件
  8. 【解决方案】客户端请求数据较大时,nginx返回数据被截断
  9. java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap问题的解决
  10. 如何解决“请考虑使用 app.config 将程序集“XXXXXXXX”从版本XXXX重新映射到版本XXXX”的问题