mediapipe-face-mesh-3d / face_mesh3d.py
Akjava's picture
fix clear files
50c7113
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