Open3D 13분할 기반 포인트 클라우드 처리

평면 분할(RANSAC 기반)

RANSAC 알고리즘을 사용하여 포인트 클라우드에서 평면을 맞춥니다.
인터페이스: segment_plane
테스트: 평면 분할

import open3d as o3d

pcd_point_cloud = o3d.data.PCDPointCloud()
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])

여기에 이미지 설명 삽입

클러스터 기반 세분화(DBSCAN 기반)

밀도 기반 클러스터링 알고리즘, 포인트 주변의 밀도에 따라 포인트가 클러스터링됨
인터페이스:
cluster_dbscan
테스트:
DBSCAN-클러스터링

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

ply_point_cloud = o3d.data.PLYPointCloud()
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])

# #分离出每个聚类的点云
# min_label = labels.min()
# pcList =[]
# for i in range(min_label,max_label+1):
#     label_index=np.where(labels == i)
#     temp_pc=pcd.select_by_index(np.array(label_index)[0])
#     pcList.append(temp_pc)
#     #o3d.visualization.draw_geometries([temp_pc])
#     o3d.io.write_point_cloud(str(i)+".pcd",temp_pc)

여기에 이미지 설명 삽입

추천

출처blog.csdn.net/zfjBIT/article/details/132006110