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

# -*- coding:utf-8 -*-import copy
import numpy as np
import open3d as o3ddef 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_sourcecorr[:, 1] = picked_id_target# 利用对应关系估计粗变换print("使用用户给定的对应关系计算粗糙变换")p2p = o3d.pipelines.registration.TransformationEstimationPointToPoint()trans_init = p2p.compute_transformation(source, target,o3d.utility.Vector2iVector(corr))# 用于改善的点对点ICPprint("执行点对点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_sourcecorr[:, 1] = picked_id_target# 利用对应关系估计粗变换print("使用用户给定的对应关系计算粗糙变换")p2p = o3d.pipelines.registration.TransformationEstimationPointToPoint()trans_init = p2p.compute_transformation(source, target,o3d.utility.Vector2iVector(corr))# 用于改善的点对点ICPprint("执行点对点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微调。
配准结果如下:

Open3d之交互式可视化相关推荐

  1. python交互式绘图库_一个交互式可视化Python库——Bokeh

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

  2. Bokeh——交互式可视化库

    文章目录 前言 如何通过Plotting绘制图形 前言 Bokeh是一个专门针对Web浏览器使用的交互式可视化库,这是与其他可视化库相比最核心的区别. 如何通过Plotting绘制图形 Plottin ...

  3. python 交互式可视化库_Python 交互式可视化库

    Python 交互式可视化库 所属分类:中间件编程 开发工具:Python 文件大小:12843KB 下载次数:1 上传日期:2018-12-06 18:40:56 上 传 者:孤独的老张 说明: 一 ...

  4. 可扩展的交互式可视化框架,用于衡量新闻中的性别偏见

    背景(Background) Over the last several months, I've been working at the Discourse Processing Lab at Si ...

  5. R+ECharts2Shiny实现web动态交互式可视化数据(中)

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...

  6. 交互式可视化报表怎么弄?看过来!

    Office作为大家经常用到的办公软件,除了一些基础操作之外,碰上特殊的数据处理和可视化图表的制作,还能使我们的报表更加"高人一等".毕竟"文不如表,表不如图" ...

  7. R语言交互式可视化包CanvasXpress推荐

    文章目录 1 CanvasXpress包简介 1.1 canvasXpress安装及加载 2 绘图实战 2.1 三维散点图 2.2 矩阵散点图 2.3 箱线图 2.4 交互图表导出和交互 3 更多信息 ...

  8. 用Python轻松创建一个交互式可视化大屏!

    大家好,我是小z,也可以叫我阿粥 本文将和大家一起学习一个专门为数据科学家(机器学习工程师)设计的基于 Python 的三方库 ---- Streamlit,它只需几行代码即可创建外观精美的应用程序, ...

  9. 用Python创建漂亮的交互式可视化效果

    Plotly is an interactive Python library that provides a wide range of visualisations accessible thro ...

最新文章

  1. 流程 - 什么是真正的Scrum?
  2. Alpha冲刺随笔集
  3. 数平精准推荐 | OCR技术之系统篇
  4. Linux 命令 —— iostat I/O 和 CPU 监视工具
  5. docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序
  6. leecode 题解 || Merge k Sorted Lists 问题
  7. 前端学习(2185):tabberitem的颜色动态
  8. 训练Tesseract
  9. Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
  10. Linux单机安装kafka
  11. 音乐服务器 linux,在Ubuntu/Debian/CentOS上安装Koel以配置个人音乐流媒体服务器
  12. django调用python脚本返回_Django使用HttpResponse返回图片并显示的方法
  13. axios传递数据到java_axios 传输与springboot后台接收数据
  14. Linux应急响应篇
  15. 洛谷Java入门级代码之分汽水
  16. WIndowsServer2012 DHCP服务器配置
  17. 【转】纯JS省市区三级联动(行政区划代码更新至2015-9-30)
  18. 网络安全-IIS短文件名枚举漏洞
  19. js 递归树根据子节点获取所有父节点
  20. 计算机病毒实训,2021计算机病毒实验报告

热门文章

  1. Wix学习整理(6)——安装快捷方式
  2. 概率论与数理统计 (二)计算题和应用题
  3. 史上最硬核的rpm和dpkg依赖问题解决方案
  4. Linux中的sed命令,使用方法之一「替换字符串中的内容 」,以及「s/ / / 」和「s/ / /g」之间的区别
  5. 关于IT结合测试,事前DB与事后DB的问题(之一:如何能更好的看出更新效果)。
  6. 【SQLServer】
  7. 解决Eclipse编译web项目失败问题
  8. Adobe Photoshop/Adobe Dreamwear/您此时无法使用此产品。您必须问题解决办法FLEXnet Licensing Service服务
  9. 记一次线程池任务执行异常
  10. PAYPAL 支付,sandbox测试的时候遇到异常:请求被中止: 未能创建 SSL/TLS 安全通道,以及解决方法。