简介:通过欧拉数来找到牙冠mesh中存在洞的坏数据
流程:会遍历每个子文件夹,首先检测存不存在多个mesh,然后检测mesh是否是watertight的。最后如果欧拉数不等于2,则存在洞
输入:dataset_pathtarget_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)
最后修改:2025 年 02 月 11 日
如果觉得我的文章对你有用,请随意赞赏