Point cloud

来源:
Docs version 0.15.1
Point cloud — Open3D 0.15.1 documentation

点云的基础使用教程

Visualize point cloud 点云可视化

读取点云文件并可视化:

import  open3d as o3d
import numpy as np
#读取点云文件(.ply、.pcd、.xzy等格式)
pcd = o3d.io.read_point_cloud(filepath)
#可视化点云,用鼠标可以选择视图,+-(小键盘区可能不行,用主键盘区的+-)可以修改点大小
o3d.visualization.draw_geometries([pcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

其中:
read_point_cloud 从文件读取点云。支持的文件类型有.ply, .pcd, .xyz等。
draw_geometries 可视化点云。可以在可视化窗口中用鼠标切换视角。也可以用键盘进行一些操作,如-可以减小点的大小。按H获取按键说明。

open3D 自带了一些点云数据,用下面的方法可以从github下载点云文件:

print("Load a ply point cloud, print it, and render it")
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
print(pcd)
print(np.asarray(pcd.points))
o3d.visualization.draw_geometries([pcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

由于github直接连不上去(网络经常抽风),这里手动复制下载地址通过代理下载(fragment.ply)。

import  open3d as o3d
import numpy as np
print("Load a ply point cloud, print it, and render it")
ply_point_cloud_path = r'fragment.ply'
#读取ply文件
pcd = o3d.io.read_point_cloud(ply_point_cloud_path)
print(pcd)
print(np.asarray(pcd.points))
#可视化ply文件
o3d.visualization.draw_geometries([pcd],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 downsampling 体素下采样

体素下采样使用规格体素网格进行标准下采样。通常作为点云任务的预处理。算法有两步:
1.将点放入体素
2.每个被占用的体素通过平均内部的所有点来生成一个点。

import  open3d as o3d
import numpy as npprint("Load a ply point cloud, print it, and render it")
ply_point_cloud_path = r'fragment.ply'
#读取ply文件
pcd = o3d.io.read_point_cloud(ply_point_cloud_path)
print(pcd)
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
print(downpcd)
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])

Vertex normal estimation 顶点法线估计

点的法线估计。按N查看法线。- +可以控制法线显示的长度。

estimate_normals 计算每个点的法线,该函数使用协方差分析查找相邻点并计算相邻点的主轴。

该函数将类KDTreeSearchParamHybrid的实例作为参数。两个关键参数radius = 0.1 max_nn = 30,指定搜索半径最大最近邻数。示例的搜索半径为10cm,最大考虑30个邻居,以节省计算时间。


import  open3d as o3d
import numpy as npprint("Load a ply point cloud, print it, and render it")
ply_point_cloud_path = r'fragment.ply'
#读取ply文件
pcd = o3d.io.read_point_cloud(ply_point_cloud_path)
print(pcd)
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
print(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],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)

Access estimated vertex normal 访问估计的顶点法线

通过downpcd.normals[idx] 访问法线

print("Print a normal vector of the 0th point")
print(downpcd.normals[0])

要查看其他变量,请使用help(downpcd) 。法线数组可以使用 np.asarray转换为 numpy 数组。

print("Print the normal vectors of the first 10 points")
print(np.asarray(downpcd.normals)[:10,:])

Crop point cloud 裁剪点云

import open3d as o3d
print("Load a polygon volume and use it to crop the original point cloud")
demo_crop_data_point_cloud_path = r'fragment.ply'
demo_crop_data_cropped_json_path = r'cropped.json'
pcd = o3d.io.read_point_cloud(demo_crop_data_point_cloud_path)
vol = o3d.visualization.read_selection_polygon_volume(demo_crop_data_cropped_json_path)
chair = vol.crop_point_cloud(pcd)
o3d.visualization.draw_geometries([chair],zoom=0.7,front=[0.5439, -0.2333, -0.8060],lookat=[2.4615, 2.1331, 1.338],up=[-0.1781, -0.9708, 0.1608])

read_selection_polygon_volume 读取指定多边形区域的json文件。
vol.crop_point_cloud(pcd) 过滤点,只保留椅子。

Paint point cloud 点云涂色

paint_uniform_color 将所有点颜色变为统一颜色。 颜色形式是RGB , 值在[0, 1]范围 。

#Paint 涂色
print("Paint chair")
chair.paint_uniform_color([1, 0.706, 0])
o3d.visualization.draw_geometries([chair],zoom=0.7,front=[0.5439, -0.2333, -0.8060],lookat=[2.4615, 2.1331, 1.338],up=[-0.1781, -0.9708, 0.1608])

Point cloud distance 点云距离

Open3D 提供了计算从源点云到目标点云的距离的方法compute_point_cloud_distance,它为源点云中的每个点计算到目标点云中最近点的距离。

在下面的示例中,我们使用该函数来计算两个点云之间的差异。请注意,此方法还可用于计算两个点云之间的倒角(Chamfer)距离。

import  open3d as o3d
import  numpy as np# Load data
demo_crop_data_point_cloud_path = r'fragment.ply'
demo_crop_data_cropped_json_path = r'cropped.json'
pcd = o3d.io.read_point_cloud(demo_crop_data_point_cloud_path)
vol = o3d.visualization.read_selection_polygon_volume(demo_crop_data_cropped_json_path)
chair = vol.crop_point_cloud(pcd)#计算距离,去除椅子
dists = pcd.compute_point_cloud_distance(chair)
dists = np.asarray(dists)
ind = np.where(dists > 0.01)[0]
pcd_without_chair = pcd.select_by_index(ind)
o3d.visualization.draw_geometries([pcd_without_chair],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])

Bounding volumes 边界框

PointCloud几何类型与 Open3D 中的所有其他几何体类型一样具有边界体积块(Bounding volumes)。目前,Open3D 实现了AxisAlignedBoundingBoxOrientedBoundingBox,也可用于裁剪几何图形。


#轴对齐边框
aabb = chair.get_axis_aligned_bounding_box()
aabb.color = (1, 0, 0)
#
obb = chair.get_oriented_bounding_box()
obb.color = (0, 1, 0)
o3d.visualization.draw_geometries([chair, aabb, obb],zoom=0.7,front=[0.5439, -0.2333, -0.8060],lookat=[2.4615, 2.1331, 1.338],up=[-0.1781, -0.9708, 0.1608])

Convex hull 凸壳

点云的凸壳是包含所有点的最小凸集。Open3D 包含计算点云的凸壳的方法compute_convex_hull。该实现基于 Qhull。

在下面的示例代码中,我们首先从网格中对点云进行采样,并计算作为三角形网格返回的凸壳。然后,我们将凸壳可视化为红色。

import open3d as o3dbunny_path = r'BunnyMesh.ply'
mesh = o3d.io.read_triangle_mesh(bunny_path)
mesh.compute_vertex_normals()pcl = mesh.sample_points_poisson_disk(number_of_points=2000)
hull, _ = pcl.compute_convex_hull()
hull_ls = o3d.geometry.LineSet.create_from_triangle_mesh(hull)
hull_ls.paint_uniform_color((1, 0, 0))
o3d.visualization.draw_geometries([pcl, hull_ls])

DBSCAN clustering DBSCAN聚类

给定点云,我们希望将局部点云聚集在一起。为此,我们可以使用聚类算法。Open3D实现了DBSCAN [Ester1996],这是一种基于密度的聚类算法。该算法在 cluster_dbscan中实现,需要两个参数:eps定义到聚类中相邻元素的距离,min_points定义形成聚类所需的最小点数。该函数返回lebels ,其中标签-1指噪声。

import open3d as o3d
import numpy as np
from matplotlib import pyplot as pltply_point_cloud_path = 'fragment.ply'
pcd = o3d.io.read_point_cloud(ply_point_cloud_path)with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))max_label = labels.max()
print(f"point cloud has {max_label + 1} clusters")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = 0
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_geometries([pcd],zoom=0.455,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])
此算法预计算所有点的 epsilon 半径内的所有邻居。如果所选的 epsilon 太大,则可能需要大量内存。

Plane segmentation 平面分割

Open3D 还支持使用 RANSAC 对点云中的几何基元进行分割。要查找点云中支撑最大的平面,我们可以使用segment_plane。该方法有三个参数:distance_threshold定义点到估计平面的最大距离才能被视为入值(inlier),ransac_n定义随机采样点数,以及num_iterations定义随机平面采样和验证的频率。然后,该函数返回平面(a,b,c,d),以便对于平面上的每个点(x,y,z),我们都有ax+by+cz+d=0 。该函数进一步返回inlier点的索引列表。

import open3d as o3dpcd_point_cloud_path = r'fragment.pcd'
pcd = o3d.io.read_point_cloud(pcd_point_cloud_path)plane_model, inliers = pcd.segment_plane(distance_threshold=0.01,ransac_n=3,num_iterations=1000)
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")inlier_cloud = pcd.select_by_index(inliers)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = pcd.select_by_index(inliers, invert=True)
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud],zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])

Hidden point removal 隐藏点移除

假设您想从给定的视点渲染点云,但背景中的点泄漏到前景中,因为它们没有被其他点遮挡。为此,我们可以应用隐藏点删除算法。在 Open3D 中,[实现了 Katz2007] 的方法,该方法从给定视图近似点云的可见性,而无需表面重建或法向估计。

import open3d as o3d
import numpy as npprint("Convert mesh to a point cloud and estimate dimensions")
armadillo_path = r'ArmadilloMesh.ply'
mesh = o3d.io.read_triangle_mesh(armadillo_path)
mesh.compute_vertex_normals()pcd = mesh.sample_points_poisson_disk(5000)
diameter = np.linalg.norm(np.asarray(pcd.get_max_bound()) - np.asarray(pcd.get_min_bound()))
o3d.visualization.draw_geometries([pcd])print("Define parameters used for hidden_point_removal")
camera = [0, 0, diameter]
radius = diameter * 100print("Get all points that are visible from given view point")
_, pt_map = pcd.hidden_point_removal(camera, radius)print("Visualize result")
pcd = pcd.select_by_index(pt_map)
o3d.visualization.draw_geometries([pcd])

Open3d-Point cloud (点云)相关推荐

  1. Open3D 可视化numpy点云数据

    Open3D 可视化numpy点云数据 使用Open3D 可视化点云数据的效果比较炫. 但是当我时隔半年重新使用Open3D库时发现原来的用法发生了改变,特此记录,持续更新. Anaconda 安装O ...

  2. 生活在别处——“Samsung Cloud Print”云打印体验

    据工信部发布的数据信息显示,截至8月底,我国移动互联网用户总数已达9.46亿户规模,其中手机上网总数超过9亿户.移动互联网用户规模的不断扩大,进一步证明拥抱移动互联网已成为不可扭转的趋势,也是各互联网 ...

  3. SAP License:SAP S/4HANA Cloud [ERP 云]

    产品文档 SAP Help Portal 提供了有关产品上手.实施.可扩展性等方面的信息. 用户管理 只需要网络连接.URL 和访问权限,用户就可以在任意设备上通过 Web 浏览器访问 SAP S/4 ...

  4. open3d显示pcd点云并读取任意点的坐标+生成点云绕任意轴旋转的transformation matrix

    为了对点云进行旋转操作,达到各点云之间不对齐的效果,找到了生成点云绕任意轴旋转的矩阵的代码. 链接: https://blog.csdn.net/u010848251/article/details/ ...

  5. eKing Cloud基础云平台演进之路

    出口转内销.首发于公司微信公众号,作者本人,现转载到此.本来写得比较技术,还算有点干货,但是结果被编辑咔咔咔,就只剩下下面这些内容. 大型企业如何开启自己的快速上云之路? 2017-12-08 易建科 ...

  6. open3d学习教程2--点云1

    目录: 1.open3d介绍 2.点云 2.1 读取,可视化点云 2.2点云体素下采样 2.3点法线估计 2.4点云着色 1.open3d介绍 接着上一节点云pointcloud open3d是一个开 ...

  7. 教程:Python Open3d 完成 ICP 点云配准

    Python Open3d 完成 ICP 点云配准 关于Open3d Open3D 是一个在Python和C++平台上的三维数据处理与可视化库.它由 Qian-Yi Zhou,Jaesik Park, ...

  8. 云上的云:AVOS Cloud在云平台上构建云服务的经验分享

    2019独角兽企业重金招聘Python工程师标准>>> 云上的云:AVOS Cloud在云平台上构建云服务的经验分享 AVOS Cloud作为国内领先的云后端服务提供商,为移动应用开 ...

  9. 西部数据mycloud虚拟服务器,西部数据(WD)My Cloud个人云(NAS)使用感受

    西部数据(WD)My Cloud个人云(NAS)使用感受 (2015-11-24 14:31:04) 标签: 西部数据 wd mycloud 个人云 nas 分类: 杂谈 因为存储照片和视频较多,电脑 ...

  10. cloud foundry云原生开发工程师考试

    文章目录 课程时间 Linux基金会 云计算的基础 Linux基金会活动 培训场地 Linux基础培训产品 Linux基金会认证 培训/认证防火墙 章概述 命令行接口 CF API Documenta ...

最新文章

  1. mysql范式与反范式_给女同事讲解MySQL数据库设计范式与反范式,她夸我“技术好”...
  2. POJ 1833 排列【STL/next_permutation】
  3. 带有AWS Lambda和Java的无服务器FaaS
  4. hdu5111 树链剖分,主席树
  5. 软件oem要注意什么_租房软件有哪些 租房有什么需要注意的地方
  6. OpenSSL 修复可导致 DoS攻击的高危漏洞
  7. java设计模式-终结者者模式
  8. HTTPS请求过程图解
  9. cocos2dx之ipone5,iphone5s去黑边
  10. OSError: exception: access violation writing 0x000000003F800000
  11. python3模拟键盘输入_python 模拟键盘输入
  12. 5G通信呼啸而来,对未来WiFi覆盖有何影响?
  13. 聚类分析及R编程实现
  14. openssl加密与模拟CA签证和颁发
  15. 简述python语言的主要领域_简述Python语言经验总结
  16. springboot启动失败的原因及其解决方法
  17. java中包中建包怎么创建,Java集成开发环境 – IDEA中建包时如何把包分开
  18. Java 提供的默认排序算法
  19. 武汉晴川学院软件工程导论可行性分析(梅宇欣)
  20. android app防被杀策略

热门文章

  1. 从法学生到坐拥两千万抖音粉丝,贫穷料理是如何一步步成为美食类顶流的?
  2. PMI-ACP练习题(12)
  3. 电脑扩展屏幕后图标都跑到副屏(扩展屏)的解决办法
  4. 信息化知识-国家信息化体系
  5. 所有外包项目威客网站列表
  6. 研发内部控制浅谈(一)(转)
  7. R语言filter()函数
  8. 一个视频娱乐应用源码
  9. 生成对抗网络GAN原理——浅显易懂,个人收藏
  10. 【智能制造】同济大学张曙教授:未来工厂;三论智能制造(经典长篇解读)