本篇教程介绍了Open3D的可视化窗口的交互功能。

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

import copy
import numpy as np
import open3d as o3d def demo_crop_geometry():
print("手动几何裁剪演示")
print(
"1) 按两次“Y”以将几何体与Y轴的负方向对齐"
)
print("2) 按“K”锁定屏幕并切换到选择模式")
print("3) 拖动以选择矩形,")
print(" 或者使用ctrl+左键单击进行多边形选择")
print("4) 按“C”获取选定的几何图形并保存")
print("5) 按“F”切换到自由视图模式")
# 加载点云
pcd = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_0.pcd")
# 可视化几何体供用户交互
o3d.visualization.draw_geometries_with_editing([pcd]) def draw_registration_result(source, target, transformation):
"""绘制配准结果"""
source_temp = copy.deepcopy(source)
target_temp = copy.deepcopy(target)
source_temp.paint_uniform_color([1, 0.706, 0])
target_temp.paint_uniform_color([0, 0.651, 0.929])
source_temp.transform(transformation)
o3d.visualization.draw_geometries([source_temp, target_temp]) def pick_points(pcd):
print("")
print(
"1) 请使用至少选择三个对应关系 [shift + 左击]"
)
print(" 按 [shift + 右击] 撤销拾取的点")
print("2) 拾取点后,按“Q”关闭窗口")
vis = o3d.visualization.VisualizerWithEditing()
vis.create_window()
vis.add_geometry(pcd)
# 激活窗口。此函数将阻止当前线程,直到窗口关闭。
vis.run() # 等待用户拾取点
vis.destroy_window()
print("")
return vis.get_picked_points() def demo_manual_registration():
print("手动ICP演示")
# 加载点云
source = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_0.pcd")
target = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_2.pcd")
print("手动对齐前两点云的可视化")
draw_registration_result(source, target, np.identity(4)) # 从两点云中拾取点并建立对应关系
picked_id_source = pick_points(source)
picked_id_target = pick_points(target)
assert (len(picked_id_source) >= 3 and len(picked_id_target) >= 3)
assert (len(picked_id_source) == len(picked_id_target))
corr = np.zeros((len(picked_id_source), 2))
corr[:, 0] = picked_id_source
corr[:, 1] = picked_id_target # 利用对应关系估计粗变换
print("使用用户给定的对应关系计算粗糙变换")
p2p = o3d.pipelines.registration.TransformationEstimationPointToPoint()
trans_init = p2p.compute_transformation(source, target,
o3d.utility.Vector2iVector(corr)) # 用于改善的点对点ICP
print("执行点对点ICP改善")
threshold = 0.03 # 3cm距离阈值
reg_p2p = o3d.pipelines.registration.registration_icp(
source, target, threshold, trans_init,
o3d.pipelines.registration.TransformationEstimationPointToPoint())
draw_registration_result(source, target, reg_p2p.transformation)
print("") if __name__ == "__main__":
demo_crop_geometry()
demo_manual_registration()

此脚本执行了两个用户交互应用程序:demo_crop_geometry()和demo_manual_registration()。

裁剪几何体

def demo_crop_geometry():
print("手动几何裁剪演示")
print(
"1) 按两次“Y”以将几何体与Y轴的负方向对齐"
)
print("2) 按“K”锁定屏幕并切换到选择模式")
print("3) 拖动以选择矩形,")
print(" 或者使用ctrl+左键单击进行多边形选择")
print("4) 按“C”获取选定的几何图形并保存")
print("5) 按“F”切换到自由视图模式")
# 加载点云
pcd = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_0.pcd")
# 可视化几何体供用户交互
o3d.visualization.draw_geometries_with_editing([pcd])

这个函数简单读取了一个点云数据然后调用了draw_geometries_with_editing函数,该函数提供了顶点选择和裁剪功能。

注意
Open3D有一个继承Visualizer类的VisualizerWithEditing类。它提供了图形用户交互功能。同样的例子在自定义可视化中,VisualizerWithEditing()是可以显示的替换掉draw_geometries_with_editing([pcd]).

在几何体显示之后,按两次Y可以将几何体与Y轴的负半轴对齐。在调整好观看视角之后,按K键锁定视图并切换到选择模式。

提示
在实际的选取区域的操作中,一般都是使用正交投影模型(orthographic projection model.)将几何体与任意轴对齐。这个技巧可以避免由于透视投影带来自遮挡问题,使得选取变得容易。

在选择区域时,可以用鼠标拖动(矩形区域)或者 ctrl + 鼠标左键点击(选取多边形区域)。下面的例子展现了多边形选取。

注意选择的区域为深色阴影,如果要保存选取的区域并且丢弃其余的,请按C。他会弹出一个对话框去保存裁剪的区域。裁剪的结果将在显示之后保存。



按F可以结束选择模式进入自由浏览模式。

手动配准

选取对应点

下面的代码使用点对点的ICP去配准两个点云。它通过人工交互来获得初始的对齐。

def demo_manual_registration():
print("手动ICP演示")
# 加载点云
source = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_0.pcd")
target = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_2.pcd")
print("手动对齐前两点云的可视化")
draw_registration_result(source, target, np.identity(4)) # 从两点云中拾取点并建立对应关系
picked_id_source = pick_points(source)
picked_id_target = pick_points(target)

这个脚本读取两组点云,并且在对齐之前可视化。

def pick_points(pcd):
print("")
print(
"1) 请使用至少选择三个对应关系 [shift + 左击]"
)
print(" 按 [shift + 右击] 撤销拾取的点")
print("2) 拾取点后,按“Q”关闭窗口")
vis = o3d.visualization.VisualizerWithEditing()
vis.create_window()
vis.add_geometry(pcd)
# 激活窗口。此函数将阻止当前线程,直到窗口关闭。
vis.run() # 等待用户拾取点
vis.destroy_window()
print("")
return vis.get_picked_points()

函数pick_points(pcd)创造了一个VisualizerWithEditing实例去模仿draw_geometries,他创造可视化窗口,添加几何图形,可视化几何图形和结束。VisualizerWithEditing提供一种新的交互函数get_picked_points(),他可以返回用户选取的顶点的索引。

在窗口中点击 shift + 左键可以选取顶点。当顶点被选取的时候,可视化窗口会在上面覆盖一个球形。比如,下图是在源点云上选取了三个顶点之后的结果。

将会打印出:

[Open3D INFO] Picked point #58900 (2.1, 1.6, 1.5) to add in queue.
[Open3D INFO] Picked point #43151 (3.3, 1.5, 1.5) to add in queue.
[Open3D INFO] Picked point #76877 (2.9, 1.9, 1.1) to add in queue.

按 q 关闭窗口,之后在目标点云上选取相应的对应点。这个球体的颜色有助于识别相同的对应点。

将会打印出:

[Open3D INFO] Picked point #48028 (1.6, 1.8, 1.3) to add in queue.
[Open3D INFO] Picked point #47210 (2.7, 1.7, 1.4) to add in queue.
[Open3D INFO] Picked point #98733 (2.4, 2.2, 1.1) to add in queue.

提示
为了有一个好的配准结果,应该去选取场景中均匀分散的三个对应点。选取拐角区域的顶点有助于选取高质量的对应点。

使用用户选取的对应关系配准

    assert (len(picked_id_source) >= 3 and len(picked_id_target) >= 3)
assert (len(picked_id_source) == len(picked_id_target))
corr = np.zeros((len(picked_id_source), 2))
corr[:, 0] = picked_id_source
corr[:, 1] = picked_id_target # 利用对应关系估计粗变换
print("使用用户给定的对应关系计算粗糙变换")
p2p = o3d.pipelines.registration.TransformationEstimationPointToPoint()
trans_init = p2p.compute_transformation(source, target,
o3d.utility.Vector2iVector(corr)) # 用于改善的点对点ICP
print("执行点对点ICP改善")
threshold = 0.03 # 3cm距离阈值
reg_p2p = o3d.pipelines.registration.registration_icp(
source, target, threshold, trans_init,
o3d.pipelines.registration.TransformationEstimationPointToPoint())
draw_registration_result(source, target, reg_p2p.transformation)
print("")

Demo的后续部分是根据用户提供的对应关系来计算初始化转换。这个脚本通过使用Vector2iVector(corr)建立了成对的对应关系。他利用TransformationEstimationPointToPoint.compute_transformation去计算一个初始化的变换。之后再此基础上使用registration_icp微调。
配准结果如下:

http://www.dtmao.cc/news_show_689725.shtml

Open3d之交互式可视化的更多相关文章

  1. 基于Python的交互式可视化工具 [转]

    前几天发现一个可视化工具Dash,当看到它的交互式效果后突然就觉得眼前一亮.早就想写出来分享给大家,今天利用睡前一点时间发出来,希望能给有需要的朋友带来一点帮助或者多一个参考. Dash介绍 在Pyt ...

  2. Bokeh 0.9.0dev 发布,交互式可视化库

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  3. 一个交互式可视化Python库——Bokeh

    本篇为<Python数据可视化实战>第十篇文章,我们一起学习一个交互式可视化Python库--Bokeh. Bokeh基础 Bokeh是一个专门针对Web浏览器的呈现功能的交互式可视化Py ...

  4. 决策树(三)决策树与Jupyter小部件的交互式可视化

    简介 决策树是广泛用于分类和回归任务的监督模型. 在本文中,我们将讨论决策树分类器以及如何动态可视化它们. 这些分类器在训练数据上构建一系列简单的if / else规则,通过它们预测目标值.  在本演 ...

  5. [译]学习IPython进行交互式计算和数据可视化(五)

    第四章:交互式绘图接口 本章我们将展示Python的绘图功能以及如何在IPython中交互式地使用它们. NumPy为处理大量的多维数组结构的数据提供了高效的方法.但是看行行列列的数字总不如直接看曲线 ...

  6. [译]学习IPython进行交互式计算和数据可视化(四)

    第三章 使用Python进行数字计算 尽管IPython强大的shell和扩展后的控制台能被任何Python程序员使用,但是这个工具最初是科学奖为科学家设计的.它的主要设计目标就是为使用Python进 ...

  7. [译]学习IPython进行交互式计算和数据可视化(二)

    第一章:开始使用IPython 在本章中,我们首先进行一遍IPython的安装过程,在大概浏览一下IPython提供的功能.IPython提供了一个高度优化的Python控制台和Notebook.除此 ...

  8. [译]学习IPython进行交互式计算和数据可视化(一)

    --学习IPython进行交互式Python编程.高性能数字计算和数据可视化 作者:Cyrille Rossant 译者:Tacey Wong 注:仅为个人翻译及学习,多有谬处,E文尚可的推荐阅读英文 ...

  9. 干货 | Bokeh交互式数据可视化快速入门

    Bokeh简介 Bokeh是一款交互式可视化库,在浏览器上进行展示. Bokeh可以通过Python(或其它语言),快速便捷地为大型流数据集提供优雅简洁的高性能交互式图表. 安装 在python中有多 ...

随机推荐

  1. 【MySQL】MySQL知识图谱

    MySQL 文章目录 MySQL 表 锁 索引 连接管理 事务 日志系统 简单记录 极客时间 - MySQL实战45讲 MySQL知识图谱 表 表 引擎选择 编码问题 表空间管理 字段设计 备份和恢复 ...

  2. canvas多重阴影发光效果

    canvas多重阴影发光效果 前言 在一个项目中,客户提了一个发光的效果,效果图如下: 阴影 有的人可能会说,这个用阴影其实就可以实现.但是从图中可以看出,是一个比较强烈的发光效果.实际的应用过程中我 ...

  3. 2021升级版微服务教程7-OpenFeign实战开发和参数调优

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  4. 【Oracle】11G 11.2.0.4 RAC环境打补丁

    一.准备工作 1,数据库环境 操作系统版本  : RedHat 7.2 x64   数据库版本    : Oracle 11.2.0.4 x64 RAC    Grid          : 11.2 ...

  5. 如何实现微信小程序动画?添加到我的小程序动画实现详细讲解,轻松学会动画开发!附壁纸小程序源码下载链接

    为了让用户能尽可能多地使用小程序,也算是沉淀用户,现在很多小程序中,都有引导用户"添加到我的小程序"的操作提示,而且大多都是有动画效果.在高清壁纸推荐小程序首页,用户每次进入,都会 ...

  6. Doge.jpg 的背后是什么,你知道么?

    图片,是我们生活中最常见的信息载体,作为一个日常生活中无处不在的事物,我们已经很习惯静态或者动态的图片了.大家也了解静态图片主要是jpg/png格式,动态图片主要为 gif.那你有没有过一瞬间的疑惑: ...

  7. 关于BAPI_GOODSMVT_CREATE中货物移动相关事务代码说明

    BAPI_GOODSMVT_CREATE参数 goodsmvt_code中的GM_CODE是为 BAPI 货物移动分配事务代码 其取值为下面对应的事务代码: 01 MB0102 MB3103 MB1A ...

  8. 大数据谢列3:Hdfs的HA实现

    在之前的文章:大数据系列:一文初识Hdfs , 大数据系列2:Hdfs的读写操作 中Hdfs的组成.读写有简单的介绍. 在里面介绍Secondary NameNode和Hdfs读写的流程. 并且在文章 ...

  9. Windows 2008server部署pxe启动安装windows系统

    前期准备: 需安装的角色有:AD域-DHCP服务器-DNS服务器-Windows部署服务,我是将这几个服务都安装在一台vps上,C盘50G,D盘100G 安装好后角色会列出所安装的服务,如下图: 1. ...

  10. Var_init class

    1 import org.apache.hadoop.conf.Configuration; 2 import org.apache.hadoop.fs.FSDataInputStream; 3 im ...