本教程演示了点云的基本用法。
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# examples/Python/Basic/pointcloud.py
import numpy as np
import open3d as o3d
if __name__ == "__main__":
print("Load a ply point cloud, print it, and render it")
pcd = o3d.io.read_point_cloud("../../TestData/fragment.ply")
print(pcd)
print(np.asarray(pcd.points))
o3d.visualization.draw_geometries([pcd])
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd])
print("Recompute the normal of the downsampled point cloud")
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(
radius=0.1, max_nn=30))
o3d.visualization.draw_geometries([downpcd])
print("Print a normal vector of the 0th point")
print(downpcd.normals[0])
print("Print the normal vectors of the first 10 points")
print(np.asarray(downpcd.normals)[:10, :])
print("")
print("Load a polygon volume and use it to crop the original point cloud")
vol = o3d.visualization.read_selection_polygon_volume(
"../../TestData/Crop/cropped.json")
chair = vol.crop_point_cloud(pcd)
o3d.visualization.draw_geometries([chair])
print("")
print("Paint chair")
chair.paint_uniform_color([1, 0.706, 0])
o3d.visualization.draw_geometries([chair])
print("")
|
可视化点云
本教程的第一部分读取点云并将其可视化。
12
13
14
15
16
|
print("Load a ply point cloud, print it, and render it")
pcd = o3d.io.read_point_cloud("../../TestData/fragment.ply")
print(pcd)
print(np.asarray(pcd.points))
o3d.visualization.draw_geometries([pcd])
|
read_point_cloud
从文件中读取点云。它尝试根据扩展名解码文件。支持的扩展名有:pcd
, ply
, xyz
, xyzrgb
, xyzn
, pts
.
draw_geometries
可视化点云。使用鼠标/触控板从不同的角度查看几何图形。
它看起来像一个密集的表面,但它实际上是一个渲染为面元的点云。GUI 支持各种键盘功能。其中之一,-键减小了点(面元)的大小。多次按下,可视化变为:
笔记
在 OS X 上,GUI 窗口可能不会收到键盘事件。在这种情况下,请尝试使用pythonw
而不是python
.
体素下采样
体素下采样使用常规体素网格从输入点云创建均匀下采样的点云。它通常用作许多点云处理任务的预处理步骤。该算法分两步运行:
-
点被分桶成体素。
-
每个占用的体素通过对内部的所有点进行平均来生成精确的一个点。
18
19
20
|
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd])
|
这是下采样的点云:
顶点法线估计
点云的另一个基本操作是点法线估计。
22
23
24
25
|
print("Recompute the normal of the downsampled point cloud")
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(
radius=0.1, max_nn=30))
o3d.visualization.draw_geometries([downpcd])
|
estimate_normals
计算每个点的法线。该函数查找相邻点并使用协方差分析计算相邻点的主轴。
该函数将KDTreeSearchParamHybrid
类的实例作为参数。两个关键参数并指定搜索半径和最大最近邻。它具有 10 厘米的搜索半径,并且最多只考虑 30 个邻居以节省计算时间。radius = 0.1
max_nn = 30
笔记
协方差分析算法产生两个相反的方向作为正常候选。在不知道几何的全局结构的情况下,两者都可能是正确的。这被称为正常方向问题。Open3D 尝试将法线定向为与原始法线(如果存在)对齐。否则,Open3D 会随机猜测。如果方向是一个问题,则需要调用进一步的方向函数,例如orient_normals_to_align_with_direction
和。orient_normals_towards_camera_location
用于draw_geometries
可视化点云并按n以查看点法线。可以用key-和key来控制法线的长度。+
访问估计的顶点法线
估计的法向量可以通过 的normals
变量来检索downpcd
。
29
30
|
print("Print a normal vector of the 0th point")
print(downpcd.normals[0])
|
Print a normal vector of 0th point
[-0.27566603 -0.89197839 -0.35830543]
要查看其他变量,请使用help(downpcd)
. 可以使用 将法线向量转换为 numpy 数组np.asarray
。
31
32
|
print("Print the normal vectors of the first 10 points")
print(np.asarray(downpcd.normals)[:10, :])
|
Print the first 100 normal vectors
[[-0.27566603 -0.89197839 -0.35830543]
[-0.00694405 -0.99478075 -0.10179902]
[-0.00399871 -0.99965423 -0.02598917]
[-0.46344316 -0.68643798 -0.56037785]
[-0.43476205 -0.62438493 -0.64894177]
[-0.51440078 -0.56093481 -0.6486478 ]
[-0.27498453 -0.67317361 -0.68645524]
[-0.00327304 -0.99977409 -0.02100143]
[-0.01464332 -0.99960281 -0.02407874]]
检查使用 NumPy以获取有关 numpy 数组的更多示例。
裁剪点云
35
36
37
38
39
40
|
print("Load a polygon volume and use it to crop the original point cloud")
vol = o3d.visualization.read_selection_polygon_volume(
"../../TestData/Crop/cropped.json")
chair = vol.crop_point_cloud(pcd)
o3d.visualization.draw_geometries([chair])
print("")
|
read_selection_polygon_volume
读取指定多边形选择区域的 json 文件。 vol.crop_point_cloud(pcd)
过滤掉点。只剩下椅子了。
绘制点云
42
43
44
45
|
print("Paint chair")
chair.paint_uniform_color([1, 0.706, 0])
o3d.visualization.draw_geometries([chair])
print("")
|
paint_uniform_color
将所有点绘制成统一的颜色。颜色在 RGB 空间,[0, 1] 范围。