import open3d as o3d import numpy as np # 点云的相交、求异 pc1 = o3d.io.read_point_cloud("1.ply", remove_nan_points=True, remove_infinite_points=True) # 原始点云 pc2 = o3d.io.read_point_cloud("2.ply", remove_nan_points=True, remove_infinite_points=True) # 求异点云 # 建立原始点云数据的kd-tree kd_tree = o3d.geometry.KDTreeFlann(pc1) # pts_idx两片点云中相同部分的索引 pts_idx = [] # k:k-nn的搜索参数,搜索另外一片点云中距离它的最近点 k = 1 # 距离阈值设为0.1 dist_max = 0.1 # 得到的点个数 points = np.array(pc2.points) pointNum = points.shape[0] # 遍历点云 for i in range(0, pointNum): # k:返回点个数 # idx:返回点索引 # dist:返回点距离 [k, idx, dist] = kd_tree.search_knn_vector_3d(knn=k, query=pc2[i]) if dist[0] < dist_max: # 距离小于阈值,则认为是相同部分的点云 pts_idx.append(i) same_part = pc2.select_by_index(pts_idx) diff_part = pc2.select_by_index(pts_idx, invert=True) same_part.paint_uniform_color([1, 0, 0]) diff_part.paint_uniform_color([0, 0, 1]) o3d.visualization.draw_geometries([same_part, diff_part], mesh_show_back_face=False)