open3d学习教程2--点云1

目录:

  • 1.open3d介绍
  • 2.点云
    • 2.1 读取,可视化点云
    • 2.2点云体素下采样
    • 2.3点法线估计
    • 2.4点云着色

1.open3d介绍

接着上一节点云pointcloud

open3d是一个开源库,支持快速处理3d数据,比如点云,体素。就像opencv是2d图像的处理库一般,open3d是3d下的处理库。open3d支持python和c++。笔者这里介绍的是python下的。
open3d安装:

pip install open3d

本节点云文件下载地址:链接:https://pan.baidu.com/s/1yTzubPtGoSe-UTGM9NgC5Q
提取码:ys15

2.点云

这里介绍点云的基本用法。点云简单来说就是3d坐标下一个个点组成的数据,每个点可以包含x,y,z,颜色、分类值、强度值、时间等等信息。有关open3d点云对象的介绍看这里:pointcloud

2.1 读取,可视化点云

这一节我们介绍读取和可视化点云,代码如下:

import open3d as o3d
import numpy as np

pcd=o3d.io.read_point_cloud(r"../test_data/fragment.ply")
print(pcd)
#无序点云,打印所有点
print(np.asarray(pcd.points).shape)
#第一个参数是要可视化的点云列表,
o3d.visualization.draw_geometries([pcd],window_name="椅子",mesh_show_wireframe=True,mesh_show_back_face=True,
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024])

首先看读取点云的函数o3d.io.read_point_cloud,这个函数返回一个点云对象,函数参数如下:
filename :点云文件路径
format:点云文件格式,默认值为auto,会自动根据文件后缀推断文件格式
remove_nan_points:是否移除为nan的点云
remove_infinite_points :是否移除值为无穷大的点云

再来看看可视化点云的函数o3d.visualization.draw_geometries,他的一些参数:
geometry_list:需要可视化的点云列表
window_name:可视化窗口标题
width:窗口宽
height:窗口高
point_show_normal :是否可视化点法线
mesh_show_wireframe :是否可视化网格线框
mesh_show_back_face:是否可视化三角网格背面
lookat:摄影机的注视向量
up:相机的上方向向量
front:摄影机的前向量。
zoom:相机的缩放

可视化结果如下:
open3d学习教程2--点云1_第1张图片
随后就可以用鼠标和键盘对可视化窗口进行一些交互操作。

2.2点云体素下采样

代码如下:

import open3d as o3d
pcd=o3d.io.read_point_cloud("./test_data/fragment.ply")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd],
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024])

voxel_down_sample是点云对象的成员方法。将点云下采样,输入参数就是体素的大小。
可视化结果如下:
open3d学习教程2--点云1_第2张图片

2.3点法线估计

代码如下:

import open3d as o3d
pcd=o3d.io.read_point_cloud("../test_data/fragment.ply")
downpcd=pcd.voxel_down_sample(voxel_size=0.05)
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1,max_nn=30))
o3d.visualization.draw_geometries([downpcd],
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024],
                                  point_show_normal=True)

我们首先对读入的点云进行体素下采样,然后对下采样的点云进行法线估计。使用的是点云对象的estimate_normals方法。estimate_normals计算每个点的法线。该函数使用协方差分析查找相邻点并计算相邻点的主轴。该方法的参数是一个用于近邻搜索的kdtree。代码中的kdtree表示搜索半径为10cm,只考虑30个近邻点。
可视化结果:
open3d学习教程2--点云1_第3张图片

2.4点云着色

先上代码:

import open3d as o3d
pcd=o3d.io.read_point_cloud("../test_data/fragment.ply")
pcd.paint_uniform_color([1,0.706,0])
o3d.visualization.draw_geometries([pcd],
                                  zoom=0.7,
                                  front=[0.5439, -0.2333, -0.8060],
                                  lookat=[2.4615, 2.1331, 1.338],
                                  up=[-0.1781, -0.9708, 0.1608])

点云对象的paint_uniform_color方法给点云上色,输入的是rgb值,范围在[0-1].
可视化结果如下:
open3d学习教程2--点云1_第4张图片

下一节:点云2

你可能感兴趣的:(open3d学习笔记,python,3d,计算机视觉,人工智能,算法)