import os import time import open3d as o3d import numpy as np def make_near_dict(base_dir,compact_dir): """""" # 用于存储结果的字典 results = {} # 遍历目录中的所有 .ply 文件 for ply_file in os.listdir(base_dir): # 检查文件是否为 .ply 格式 if ply_file.endswith('.ply'): ply_path = os.path.join(base_dir, ply_file) compact_ply_path = os.path.join(compact_dir, ply_file) if os.path.exists(compact_ply_path): ply_read_path = compact_ply_path else: ply_read_path = ply_path # 读取点云 pcd = o3d.io.read_point_cloud(ply_read_path) # 获取点云的点数据 points = np.asarray(pcd.points) # 计算质心 centroid = np.mean(points, axis=0) # 计算 Y 轴最小值 min_y_value = np.min(points[:, 1]) # Y 轴最小值 max_y_value = np.max(points[:, 1]) # 计算 X 轴最小值 min_x_value = np.min(points[:, 0]) # X 轴最小值 max_x_value = np.max(points[:, 0]) # X 轴最小值 #ply_pid = ply_file.split("_")[0] # 将结果存入字典 results[ply_file] = { "centroid": centroid, "min_x_value": min_x_value, "min_y_value": min_y_value, "max_x_value": max_x_value, "max_y_value": max_y_value, } # 打印结果 # for ply_file, values in results.items(): # print(f"文件: {ply_file}") # print(f" 质心: {values['centroid']}") # print(f" X 轴最小值: {values['min_x_value']}") # print(f" Y 轴最小值: {values['min_y_value']}") # 计算每个ply需要触碰检测的 check_touch_dict = {} for ply_file in results.keys(): print(ply_file) #ply_pid = ply_file.split("_")[0] #print(ply_pid) bounds_min_x = results[ply_file]["min_x_value"] bounds_min_y = results[ply_file]["min_y_value"] #bounds_center = results[ply_file]["centroid"] need_check_list = [] need_values_dict = {} for ply_file_near in results.keys(): #print(ply_file_near) if ply_file!= ply_file_near: bounds_max_x = results[ply_file_near]["max_x_value"] bounds_max_y = results[ply_file_near]["max_y_value"] # if ply_file == "151140_9cm_x1=30.578+41.705+90.753.ply": # print("-"*50) # print("主::",ply_file) # print("从::",ply_file_near) # print(f"center_x{bounds_center[0]}") # print(f"center_y{bounds_center[1]}") # print(f"bounds_max_x{bounds_max_x}") # print(f"bounds_max_y{bounds_max_y}") # time.sleep(3) # 235605_12cm_x1=33.774+30.837+120.344.ply # if bounds_center[0]bounds_min_x and bounds_near_center[1]>bounds_min_y: #print("-"*50) # print(f"bounds_min_x{bounds_min_x}") # print(f"bounds_max_x{bounds_max_x}") x_dis = bounds_min_x - bounds_max_x y_dis = bounds_min_y - bounds_max_y #print(f"x_dis=={x_dis}") #print(f"y_dis=={y_dis}") #if ply_file=="158040_15cm_x1=80.682+89.345+152.468.ply": #if ply_file == "235547_4.8cm_x1=29.339+39.528+57.63.ply": # print("主::",ply_file) # print("从::",ply_file_near) #if ply_file == "158040_15cm_x1=80.682+89.345+152.468.ply": #if ply_file == "151140_9cm_x1=30.578+41.705+90.753.ply": # print("主::", ply_file) # print("临近::", ply_file_near) # time.sleep(3) if x_dis<-10 and y_dis<-10: need_check_list.append(ply_file_near) need_values_dict["need_check_list"] = need_check_list # need_values_dict["max_x_value"] = bounds_max_x # need_values_dict["max_y_value"] = bounds_max_y check_touch_dict[ply_file] = need_values_dict # print(check_touch_dict) # print("开始要计算触碰检测的数据") # for ply_file, values in check_touch_dict.items(): # print("*"*50) # print(ply_file) # print(values) # 去掉离比较远的数据 for check_touch_key,check_touch_values in check_touch_dict.items(): print("-"*50) #print(check_touch_key) #print(check_touch_values["need_check_list"]) need_check_list= check_touch_values["need_check_list"] #print(len(need_check_list)) if len(need_check_list)>2: ply_A_path = os.path.join(base_dir, check_touch_key) compact_ply_path = os.path.join(compact_dir, check_touch_key) if os.path.exists(compact_ply_path): ply_read_path = compact_ply_path else: ply_read_path = ply_A_path pcd_A = o3d.io.read_point_cloud(ply_read_path) points_A = np.asarray(pcd_A.points) distances = [] for i, check_touch in enumerate(need_check_list): point = results[check_touch]['centroid'] ply_path = os.path.join(base_dir, check_touch) # 读取当前点云 pcd = o3d.io.read_point_cloud(ply_path) points = np.asarray(pcd.points) # 计算点云之间最小点对距离(brute-force) diff = points_A[:, np.newaxis, :] - points[np.newaxis, :, :] # (N, M, 3) dists = np.linalg.norm(diff, axis=2) # (N, M) min_distance = np.min(dists) #print(f"check_touch: {check_touch}, centroid: {point}, min_distance: {min_distance:.4f}") distances.append((i, point, min_distance, check_touch)) distances.sort(key=lambda x: x[2]) # 提取最近的 3 个点 nearest_points = distances[:5] last_elements = [item[-1] for item in nearest_points] # print(f"nearest_points---------{nearest_points}") # print(f"check_touch_key--------{check_touch_key}") # print(f"last_elements--------{last_elements}") check_touch_dict[check_touch_key]["need_check_list"] = last_elements return check_touch_dict # for check_touch_key,check_touch_values in check_touch_dict.items(): # print("*"*50) # print(check_touch_key) # print(check_touch_values) if __name__ == '__main__': bounds_fix_out_dir = "/data/datasets_20t/type_setting_test_data/print_bounds_fix_data/" check_touch_dict=make_near_dict(bounds_fix_out_dir) print(f"check_touch_dict--------------{check_touch_dict}") """ {'need_check_list': ['131508_18cm_x1=51.412+87.921+181.446.ply', '239617_12cm_x1=43.987+54.233+120.691.ply']}, """