Open3d之自定义可视化
通过draw_geometries
和draw_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()
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)
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()
Open3d之自定义可视化相关推荐
- Open3d之交互式可视化
本篇教程介绍了Open3D的可视化窗口的交互功能. # -*- coding:utf-8 -*-import copy import numpy as np import open3d as o3dd ...
- seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot)
seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot) 目录 seaborn可视化散点图并自定义可视化结果图像的大小(Change ...
- python使用matplotlib可视化线图(line plot)、自定义可视化图像的四个边框的色彩、可以分别设置矩形每一条边的色彩(change the axis color)
python使用matplotlib可视化线图(line plot).自定义可视化图像的四个边框的色彩.可以分别设置矩形每一条边的色彩(change the axis color of a plot ...
- R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值、自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)
R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值.自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N.中位数median.四分位数的间距iqr) 目录
- R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色、改变图像(plot)区域的背景色
R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色.改变图像(plot)区域的背景色 目录
- Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)
Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color) 目录
- R语言axis函数自定义可视化的坐标轴刻度线(axis ticks)
R语言axis函数自定义可视化的坐标轴刻度线(axis ticks) 目录 R语言axis函数自定义可视化的坐标轴刻度线(axis ticks) # 自定义轴刻度
- vs 调试 无法加载自定义可视化工具_推荐 5 款好用的REST API工具
作者 | Marta Krzyk 首发|架构头条 译者 | 王强 策划 | 小智 市面上可用的 REST API 工具选项有很多,我们来看看其中一些开发人员最喜欢的工具. 1 API 定义 Swagg ...
- WPF TreeView自定义可视化树样式
目前项目中效果(没上传,需要的留言) 以下例子 最终效果: TreeView 折叠箭头,带垂直方向.水平方向层级线条(如图) 来看看怎么一步步实现吧~ 补充一点,代码本地试过,现剪切的所以可能部分运行 ...
最新文章
- 机器学习者应知的五大深度学习框架
- firewall-cmd命令管理防火墙
- band math函数_ENVI波段运算(bandmath)运算逻辑及常用运算符详解
- Java多线程精讲(非高并发-授课专用)附synchronized
- 别名、浅复制与深复制
- CVE-2009-3459
- windows dc linux,active-directory – Linux AD集成,使用Windows Server 2012 DC时无法登录
- 年轻人还在讨论要不要躺平时,阿里已经注册了“躺平”商标
- 基于JAVA+SpringMVC+Mybatis+MYSQL的酒店预订系统
- Python图像处理库PIL的ImageDraw模块之画出四边形
- SpringMVC_跟踪请求
- 这样的极客大会千万别停!如今中国太需要为技术传道、为极客正名
- 使用 python 管理 mysql 开发工具箱 - 2
- 敏感词过滤/字符编码
- serv-u and hway3.0
- 搜索引擎使用的10个技巧
- Microsemi Libero SoC 教程1 (Libero开发环境)
- 使用List进行分组操作
- SDL下播放声音文件
- Integrating Factor
热门文章
- suse linux rpm 安装
- Ubuntu 18安装谷歌浏览器
- Shell脚本监控LVS后台服务器存活状态
- 通过filebeat、logstash、rsyslog采集nginx日志的几种方式
- 免密钥登录linux
- 关于ibatis的SQL注入。
- 深度 linux支持debian,基于Debian的Linux发行版安装深度音乐及其插件
- 【解决方案】客户端请求数据较大时,nginx返回数据被截断
- java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap问题的解决
- 如何解决“请考虑使用 app.config 将程序集“XXXXXXXX”从版本XXXX重新映射到版本XXXX”的问题