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:
pipandconda
# 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)

看起来跟毛毛虫一样…
提供了一组用户交互指令:

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

被折叠的 条评论
为什么被折叠?



