简介:通过欧拉数来找到牙冠mesh中存在洞的坏数据
流程:会遍历每个子文件夹,首先检测存不存在多个mesh,然后检测mesh是否是watertight的。最后如果欧拉数不等于2,则存在洞
输入:dataset_path和target_path,分别是需要被检测文件夹和分割出来文件夹的放置目录。
import trimesh
import os
import glob
import shutil
def load_tooth_crown_file(directory="."):
pattern = os.path.join(directory, "tooth_crown_*.ply")
files = glob.glob(pattern)
if not files:
print("No tooth_crown_*.ply files found in the directory")
return None
elif len(files) == 1:
file_path = files[0]
else:
# If multiple matches are found, load the first one by default
print("Multiple tooth_crown files found")
for i, f in enumerate(files, start=1):
print(f"{i}. {f}")
file_path = files[0]
print(f"Loading the first file by default: {file_path}")
try:
mesh = trimesh.load(file_path)
return mesh
except Exception as e:
print(f"Error loading file {file_path}: {e}")
return None
def detect_hole(mesh, name):
if mesh.is_watertight:
# print("Detection result: Mesh is watertight, ", end='')
euler_number = mesh.euler_number
# print("Euler number is:", euler_number, end=',')
if euler_number != 2:
print(f"Euler number is abnormal, mesh {int(name)} has holes")
return True
else:
# print("Euler number is normal, mesh is closed")
return False
else:
print(f"Detection result: Mesh {int(name)} is not watertight, has open boundary holes")
return True
def process_dataset(dataset_folder):
data_group_folders = [
os.path.join(dataset_folder, d)
for d in os.listdir(dataset_folder)
if os.path.isdir(os.path.join(dataset_folder, d))
]
# print(f"Found {len(data_group_folders)} data group folders under {dataset_folder}")
invalid_groups = [] # To record problematic data
for group_folder in data_group_folders:
# print(f"\nProcessing data group folder: {group_folder}")
mesh = load_tooth_crown_file(group_folder)
if mesh is None:
print(f"[{group_folder}] Unable to load tooth_crown file, skipping this data group")
continue
if detect_hole(mesh, os.path.basename(group_folder)):
invalid_groups.append(group_folder)
print("\n----------------------------------------")
print(f"Total {len(invalid_groups)} problematic data groups found")
return invalid_groups
def cut_faulty_data(invalid_groups, target_folder):
if not os.path.exists(target_folder):
os.makedirs(target_folder)
print(f"Target folder {target_folder} does not exist, created automatically")
# Move faulty data groups to the target folder
for folder in invalid_groups:
folder_name = os.path.basename(folder)
target_path = os.path.join(target_folder, folder_name)
try:
shutil.move(folder, target_path)
print(f"Moved data group {folder_name} to {target_folder}")
except Exception as e:
print(f"Error moving data group {folder_name}: {e}")
def process_faulty_data_in_dataset(dataset_path, target_path):
invalid_groups = process_dataset(dataset_path)
# cut_faulty_data(invalid_groups, target_path)
if __name__ == "__main__":
dataset_path = '/data7/haolin/TeethData/cache'
target_path = ''
# Call function to process the dataset
process_faulty_data_in_dataset(dataset_path, target_path)
1 条评论
[...]这一页包含了我所有处理牙科数据的代码,以及他们的用处是什么。crown_with_hole[...]