点云 3D 可视化 - Open3D 库_open3d库-程序员宅基地

技术标签: # 开发 工具  3d  

1. 文章信息

(1)标题:Open3D: A Modern Library for 3D Data Processing (2018)

(2)文章链接:https://arxiv.org/pdf/1801.09847.pdf

(3)Open3D 库网址:http://www.open3d.org/

2. Open3D 库简介

  • Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。Open3D 前端在 C++ 和 Python 中公开了一组精心选择的数据结构和算法。后端经过高度优化,并设置为并行化。Open3D 是从一块干净的石板上开发出来的,有一个小的、经过仔细考虑的依赖项集。它可以在不同的平台上设置,并从源代码进行编译,只需很少的工作量。代码干净、样式一致,并通过清晰的代码审查机制进行维护。Open3D已经在许多已发表的研究项目中使用,并积极部署在云端。我们欢迎开源社区的贡献。核心特性如下:
  • Simple installation via conda and pip
  • 3D data structures
  • 3D data processing algorithms
  • Scene reconstruction
  • Surface alignment
  • PBR rendering
  • 3D visualization
  • Python binding
  • 安装方法
conda install open3d  或者  pip install open3d

2. 3D 可视化使用

2.1 单帧点云

import numpy as np
import open3d as o3d


def hsv2rgb(h_, s_, v_):
    r_ = 0
    g_ = 0
    b_ = 0

    c_ = v_ * s_
    x_ = c_ * (1 - (abs((h_ / 60) % 2 - 1)))
    m = v_ - c_

    if (h_ >= 0) and (h_ < 60):
        r_ = c_ + m
        g_ = x_ + m
        b_ = 0 + m
    elif (h_ >= 60) and (h_ < 120):
        r_ = x_ + m
        g_ = c_ + m
        b_ = 0 + m
    elif (h_ >= 120) and (h_ < 180):
        r_ = 0 + m
        g_ = c_ + m
        b_ = x_ + m
    elif (h_ >= 180) and (h_ < 240):
        r_ = 0 + m
        g_ = x_ + m
        b_ = c_ + m
    elif (h_ >= 240) and (h_ < 300):
        r_ = x_ + m
        g_ = 0 + m
        b_ = c_ + m
    elif (h_ >= 300) and (h_ < 360):
        r_ = c_ + m
        g_ = 0 + m
        b_ = x_ + m

    return np.array([r_, g_, b_])  # 0~1


data_path = '/home/hjw/point_cloud_test/point_cloud_test_data.npy'  # 本人自己的测试数据,直接替换即可
point_cloud = np.load(data_path).astype(np.float32, copy=False)

point_xyz = point_cloud[:, :3]  # x, y, z
point_intensity = point_cloud[:, 3]  # intensity

# point_color = []  # user defined colormap
# colormap = np.array([[150, 150, 150],
#                     [255, 0, 255],
#                     [0, 255, 0],
#                     [255, 255, 0]]) / 255.0
# for point_id in range(point_cloud.shape[0]):
#     color_value = 0
#     point_color.append(colormap[color_value])

# point_color = []  # ros colormap
# for point_id in range(point_cloud.shape[0]):
#     color_value = max(min(point_intensity[point_id], 255), 0) / 255.0 * 240.0
#     point_color.append(hsv2rgb(color_value, 1, 1))

point_color = []  # pc colormap
for point_id in range(point_cloud.shape[0]):
    color_value = max(min(255 - point_intensity[point_id], 255), 0) / 255.0 * 240.0
    point_color.append(hsv2rgb(color_value, 1, 1))

pcd = o3d.geometry.PointCloud()  # 传入3d点云

pcd.points = o3d.utility.Vector3dVector(point_xyz)  # point_xyz 二维 numpy 矩阵,将其转换为 open3d 点云格式

pcd.colors = o3d.utility.Vector3dVector(point_color)  # 根据 intensity 和 colormap 着色

vis = o3d.visualization.Visualizer()
vis.create_window(width=800, height=600)  # 创建窗口
render_option = vis.get_render_option()  # 渲染配置
render_option.background_color = np.array([0, 0, 0])  # 设置点云渲染参数,背景颜色
render_option.point_size = 1.0  # 设置渲染点的大小
vis.add_geometry(pcd)  # 添加点云

view_control = vis.get_view_control()  # 视角配置
# view_control.change_field_of_view(step=30)
# view_control.rotate(90.0, 10.0)
# view_control.set_front([0, 1, 0.5])
# view_control.set_lookat([1, 0, 0])
# view_control.set_up([0, -1, 0])
# view_control.translate(-50, -100)
view_control.set_zoom(0.2)

vis.run()

vis.destroy_window()

详细参数介绍见 API 网址:http://www.open3d.org/docs/release/python_api/open3d.visualization.ViewControl.html

请添加图片描述

2.2 多帧点云

import os
import numpy as np
import open3d as o3d

folder_path = '/home/hjw/point_cloud_test/'  # 本人自己的测试数据路径,直接替换即可
files = os.listdir(folder_path)

vis = o3d.visualization.Visualizer()
vis.create_window(width=800, height=600)  # 创建窗口
pcd = o3d.geometry.PointCloud()
to_reset = True
vis.add_geometry(pcd)

for file_index in range(len(files)):

    data_path = os.path.join(folder_path, files[file_index])
    point_cloud = np.load(data_path).astype(np.float32, copy=False)
    
    point_xyz = point_cloud[:, :3]  # x, y, z
    point_intensity = point_cloud[:, 3]  # intensity

    pcd.points = o3d.utility.Vector3dVector(point_xyz)
    
    vis.update_geometry(pcd)
    
    if to_reset:
        vis.reset_view_point(True)
        to_reset = False
    
    vis.poll_events()
    vis.update_renderer()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/i6101206007/article/details/123403598

智能推荐

go语言生成自定义uuid_由浅入深:一个简单的例子,让你吃透Go语言自定义的包管理...-程序员宅基地

文章浏览阅读341次。前言首先使用hello world,演示Go的包是如何导入的。package mainimport "fmt"func main() {fmt.Println("Hello, world")}其中 “fmt” 就是就是Go内置的一个包,包含与格式化和输出到屏幕相关的各种功能。包的好处使用这种方式导入包,有以下3个好处:降低函数方法重名的可能,让函数保持简短和简洁。有效地组织代码,很方便导向到标的。..._controllers/demo_controller.go:73:35: undefined: uuid

东周科目三考场5号线_全国科目三考场考试视频视频教程方法秘籍攻略步骤及注意事项技巧!...-程序员宅基地

文章浏览阅读4.8k次。全国科目三考场考试视频教程教学专业讲解语音实地视频讲解专业收费版实地考场讲解语音高清流畅,绝非免费版可比,助你考试一把过!路考16项,项目多细节全。比科目二的难度有过之而无不及,稍不注意就直扣100分。很多学员考完科三都是一身的汗,因为必须绷紧了神经才能保证所有的细节不会出错。要是小问题出错,技术再牛也白搭。考前多看几遍视频牢记要点!助你考试一把过!科目三考场考试视频教程教学专业讲解语音..._深圳驾考科目三东周考场

UDS简介-程序员宅基地

文章浏览阅读366次。UDS简介

【mmdet3d配置】win11+Debian子系统_win11 debian-程序员宅基地

文章浏览阅读1k次。mmdet3d +win11+Debian子系统不想安装双系统,又馋windows的UI,还需要linux的生产力,毕竟很多代码暂时只支持linux。所以就有了这篇文章~_win11 debian

Environment.Exit(0)和Environment.Exit()方法-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏17次。net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法2009年04月09日 23:59:00 fengloveyun 阅读数:1470.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法.net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应..._environment.exit

JAVA中十四种常见开发工具及其特点-程序员宅基地

文章浏览阅读125次。1、JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的Java开发工具集(JDK)。开发人员和最终用户可以利用这个工具来开发java程序。  JDK简单易学,可以通过任何文本编辑器(如:Windows 记事本、UltrEdit、Editplus、FrontPage以及dreamweaver..._五种java开发工具的使用现状和特点

随便推点

IDEA中 @override报错的解决方法-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏6次。起因 今天用IDEA导入一个java工程时,碰上一个问题,代码中所有@override处标红,并提示:@override不支持对接口的实现。 原因是引用JDK5版本中存在小bug的问题。@Override是JDK5就已经有了,但是不支持对接口的实现,认为这不是Override而报错。JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override。 解决方法一:【如果是用本地的tomcat配置】File >> Project St.._@override报错

使用ArcGis工具合并图层-程序员宅基地

文章浏览阅读4.7k次。1.开始编辑 2.选中要合并的图层:根据图层的编号,点击Selected后,再点击Merge,合并 _arcgis 合并图层 json

.waitFor()卡死_exec.waitfor()-程序员宅基地

文章浏览阅读868次。二、查找原因经过查找资料了解到:Process.waitFor可能导致死锁?因为本地的系统对标准输入和输出所提供的缓冲池有限,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程死锁。问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。接着来分析缓冲区,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,_exec.waitfor()

触摸屏驱动问题解决_swal-overlay触摸屏问题-程序员宅基地

文章浏览阅读971次。最近在做电子书是用到触摸屏是卡住了,因为之前触摸屏驱动编写的时候就遇到问题没有解决,网上说问题在于mini2440不同于其他开发板,触摸屏使用的一线触控,而不是四线触控,相关的解决方法也是找了好久,最终在一个帖子上找到了http://blog.csdn.net/doccode/article/details/46520275 这是网址。按照里面的方法修改电路之后,终于可以和视频一样用了。_swal-overlay触摸屏问题

spongeboblz的博客——JavaScript-程序员宅基地

文章浏览阅读101次。JavaScript 对象及对象的创建ES 规范中this问题说明目录总纲

项目中的富文本编辑器该如何选择?_vue-quill-editor 和 tinymce那个好用-程序员宅基地

文章浏览阅读393次。项目中经常需要用到富文本编辑器的时候,而常见的富文本编辑器都有哪些?该如何选择?先看看市面上都有哪些可用的富文本编辑器:TinyMCE(插件式的,支持 Vue,React,Angular 框架)wangEditor(Typescript 开发的 Web 富文本编辑器, 轻量、简洁、易用、开源免费,支持 JS 直接引入使用,或者 Vue2/3,React)UEditor(开源,插件多,功能齐全,支持 JS 直接引入使用)CKEditor(模块化的简洁强大,丰富的框架支持,支持 Vue,React._vue-quill-editor 和 tinymce那个好用