import pyvista as pv import numpy as np import cv2 from glibvision.cv2_utils import pil_to_bgr_image from gradio_utils import clear_old_files,get_image_id from mp_utils import get_pixel_cordinate_list,extract_landmark,get_pixel_cordinate,get_normalized_xyz import mp_triangles import io import hashlib import os def process_image3d(image,smooth_mesh,depto_ratio,inner_eyes,inner_mouth): clear_old_files() mp_image,face_landmarker_result = extract_landmark(image) landmark_points = [get_normalized_xyz(face_landmarker_result.face_landmarks,i) for i in range(0,468)]#468 0478 is iris aspect_ratio = image.width/image.height yup = [#I'm not sure # I'm not sure ( point[2]*aspect_ratio*depto_ratio,1.0-point[0]*aspect_ratio,1.0 - point[1]) for point in landmark_points ] uv = [ ( point[0],1.0-point[1]) for point in landmark_points ] # 頂点座標 (x, y, z) vertices = np.array( yup ) # 三角形インデックス def flatten_and_interleave(list_of_lists): return [([len(item)] + list(item) )for item in list_of_lists] faces = np.array( flatten_and_interleave(mp_triangles.get_triangles_copy(True,inner_eyes,inner_eyes,inner_mouth)) ) # PolyDataオブジェクトの作成 mesh = pv.PolyData(vertices, faces) id = get_image_id(image) os.makedirs("files",exist_ok=True) path = f"files/{id}.gltf"#TODO uniq file texture = pv.Texture(np.array(image, dtype=np.uint8)) uv_coords = np.array(uv,dtype="float32") mesh.active_texture_coordinates = uv_coords pl = pv.Plotter() pl.add_mesh(mesh,texture=texture,smooth_shading=smooth_mesh) pl.export_gltf(path) return path