【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除

文章目录

本文是
上一篇文章

的延续,也是open3d处理点云的高级操作篇。本文将依次介绍open3d如何处理点云边界框、凸包、DBSCAN、RANSCA和隐点移除等操作。

  1. 点云边界框

点云几何类型和其他类型一样,也有包围框。当前,open3d实现了两个包围框接口, AxisAlignedBoundingBoxOrientedBoundingBox,它们区别如下表所示。同时他们也可以用来裁剪几何图形。

函数名称说明图形说明AxisAlignedBoundingBox轴对齐边界框aabb每条边都有平行的轴

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除
import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("../test_data/fragment.ply")

vol = o3d.visualization.read_selection_polygon_volume(
    "../test_data/Crop/cropped.json")
chair = vol.crop_point_cloud(pcd)

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])

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除
  1. 凸包(convex hull)

点云的凸包是包含所有点的最小凸集,open3d实现了计算凸包的方法 compute_convex_hull,这个接口的实现基于Qhull

import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("../test_data/fragment.ply")

vol = o3d.visualization.read_selection_polygon_volume(
    "../test_data/Crop/cropped.json")
chair = vol.crop_point_cloud(pcd)

hull, _ = chair.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([chair, hull_ls])

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除
  1. DBSCAN聚类

open3d实现了DBSCAN [Ester1996]算法,这是一种基于密度的聚类算法。该算法需要两个参数。

labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))
  • 入参:
  • eps: 定义到聚类 相邻点云的距离
  • min_points: 定义形成聚类所需的 最小点数

  • 出参:

该函数返回一个标签,其中标签-1表示噪音。

import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt

pcd = o3d.io.read_point_cloud("../test_data/fragment.ply")

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])

输出:

[Open3D DEBUG] Precompute neighbors.

Precompute neighbors.[========================================] 100%
[Open3D DEBUG] Done Precompute neighbors.

[Open3D DEBUG] Compute Clusters
[Open3D DEBUG] Done Compute Clusters: 10==========>] 97%
point cloud has 10 clusters

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除
  1. RANSAC平面分割

Open3D还支持使用RANSAC从点云分割算法,其中segment_plane用于平面分割算法,该算法的有三个参数:

  1. distance_threshold:inlier的最大距离阈值
  2. ransac_n:随机采样的平面点数
  3. num_iterations:表示最小迭代次数。
import open3d as o3d

pcd = o3d.io.read_point_cloud("../test_data/fragment.pcd")
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])

输出:

Plane equation: -0.06x + -0.10y + 0.99z + -1.06 = 0

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除
  1. 隐点移除(Hidden point removal)

由于点云分辨率的问题,如果你只想看前景点,就需要滤掉背景点。为此,我们可以应用隐藏点移除(Hidden point removal) 算法&#x8BE5;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x8FD1;&#x4F3C;&#x7684;&#x7ED9;&#x51FA;&#x4E00;&#x4E2A;&#x89C6;&#x89D2;&#x4E0B;&#x7684;&#x53EF;&#x89C6;&#x70B9;&#x4E91;

import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("../test_data/fragment.ply")

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 * 100

print("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])

输出:

Define parameters used for hidden_point_removal
Get all points that are visible from given view point
Visualize result

原始视角下的视图:

【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除
经过隐点移除之后的视图:
【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除

Original: https://blog.csdn.net/QLeelq/article/details/122136481
Author: 非晚非晚
Title: 【点云处理技术之open3d】第三篇:点云的高级操作篇——点云边界框、凸包、DBSCAN聚类、平面分割和隐点移除

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549592/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球