Open3D点云处理

本文详细介绍了Open3D库在处理3D点云数据方面的应用,包括点云的读取、显示、体素下采样、正态估计、裁剪、绘制、聚类等操作,并展示了相应的Python代码示例。Open3D提供了一套全面的工具,支持从数据读取到复杂操作的全过程,是3D数据处理和可视化的强大工具。

Open3D点云处理


一、Open3D

Open3D is an open-source library that supports rapid development of software that deals with 3D data. The Open3D frontend exposes a set of carefully selected data structures and algorithms in both C++ and Python. The backend is highly optimized and is set up for parallelization.

Open3D是一个支持3D数据处理软件快速开发的开源库,在前端提供了一组精挑细选的C++和Python数据结构与算法。并且在后端高度优化且支持并行化。

核心要素包括:

  • 3D数据结构
  • 3D数据处理算法
  • 场景重建
  • 3D可视化
  • 3D机器学习等

Python版快速安装

需要的环境为:

  • OS:Ubuntu 18.04+、macOS 10.15+、Windows 10(64-bit)
  • Python: 3.6-3.9
  • Pre-packages: pip and conda
# Install
pip install open3d

# Verify installation
python -c "import open3d as o3d; print(o3d.__version__)"

# Python API
python -c "import open3d as o3d; \
           mesh = o3d.geometry.TriangleMesh.create_sphere(); \
           mesh.compute_vertex_normals(); \
           o3d.visualization.draw(mesh, raw_mode=True)"

# Open3D CLI
open3d example visualization/draw

二、Open3D点云加载与显示

2.1 点云读取

Open3D提供了直接从文件中读取点云数据的API:

open3d.io.read_point_cloud(filename, format='auto', remove_nan_points=False, \
remove_infinite_points=False, print_progress=False)

Parameters

  • filename (str) – 文件路径
  • format (str,optional,default=‘auto’) – 文件的格式,默认是auto,将影响如何读取文件
  • remove_nan_points (bool*,* optional*,* default=False) – 是否移除值为nan的点
  • remove_infinite_points (bool*,* optional*,* default=False) – 是否移除值为inf的点
  • print_progress (bool*,* optional*,* default=False) – 当该值为True时,将会在可视化时出现一个过程条

Return

  • open3d.geometry.PointCloud对象

其中,format参数的可选参数为:

格式 描述
xyz 每一行包含[x,y,z]
xyzn 每一行包含[x,y,z,nx,ny,nz]
xyzrgb 每一行包括[x,y,z,r,g,b] rgb为[0,1]之间的float类型
pts 第一行表示点数,之后每行包括[x,y,z,i,r,g,b] rgb为unit8类型
ply ply文件
pcd pcd文件

我们来尝试读取一下数据

import open3d as o3d

pcd=o3d.io.read_point_cloud(r"Cloud.pcd")
print(pcd)

'''
PointCloud with 2001009 points.
'''
# 此时点云数据已经被读入了

当然,对于某些格式稀奇古怪的,我们也可以通过转成ndarray然后再进行读取:

import numpy as np
import open3d as o3d

# 读取到ndarray
data=np.genfromtxt(r'modelnet40_normal_resampled\airplane\airplane_0001.txt',delimiter=",")
# 创建PointCloud类
pcd=o3d.geometry.PointCloud()
pcd.points=o3d.utility.Vector3dVector(data[:,:3])
print(pcd)

'''
PointCloud with 10000 points.
'''

关于PointCloud的属性,主要有以下四类:

  • colors: 颜色信息,在可视化时能为几何体赋予视觉信息
  • covariances: 协方差
  • normal: 法向量
  • points: 位置信息

2.2 点云可视化

在Open3D中,点云可视化其中之一的API为:

draw_geometries(geometry_list, window_name=’Open3D’, width=1920,\
 height=1080, left=50, top=50, point_show_normal=False,\
  mesh_show_wireframe=False, mesh_show_back_face=False,\
   lookat, up, front, zoom)

Parameters

  • geometry_list (List[open3d.geometry.Geometry]) – 需要可视化的几何体列表.
  • window_name (str, optional, default=‘Open3D’) – 窗口名称
  • width (int, optional, default=1920) – 窗口宽度
  • height (int, optional, default=1080) – 窗口高度
  • left (int, optional, default=50) – 窗口左边界
  • top (int, optional, default=50) – 窗口顶部边界
  • point_show_normal (bool, optional, default=False) – 是否展示法向量
  • mesh_show_wireframe (bool, optional, default=False) – 是否可视化网格线框
  • mesh_show_back_face (bool, optional, default=False) – 同时可视化格网三角形背部
  • **lookat ** (numpy.ndarray[float64[3,1]]) – 相机注视向量
  • up (numpy.ndarray[float64[3,1]]) – 相机的上方向向量
  • front (numpy.ndarray[float64[3,1]]) – 相机的前矢量
  • zoom (float) – 相机缩放倍数

Returns

  • None

我们来尝试一下:

o3d.visualization.draw_geometries([pcd])

在这里插入图片描述

显示法向量:

pcd.normals=o3d.utility.Vector3dVector(data[:,3:])
o3d.visualization.draw_geometries([pcd],window_name="o3d",width=1920,height=1080,
                                  left=50,top=50,point_show_normal=True)

在这里插入图片描述

看起来跟毛毛虫一样…

提供了一组用户交互指令:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值