A-VirtualMakeup / app.py
Anupam202224's picture
Rename appy.py to app.py
7fe2b23 verified
import gradio as gr
import cv2
import numpy as np
import dlib
from skimage import io, color
# Load the facial landmark predictor
predictor_path = "shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
# Helper function to convert hex color to BGR tuple
def hex_to_bgr(hex_color):
hex_color = hex_color.lstrip('#')
rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
return (rgb[2], rgb[1], rgb[0])
# Function to apply makeup
def apply_makeup(image, eye_color, lipstick_color):
eye_color_bgr = hex_to_bgr(eye_color) if eye_color else (0, 0, 255)
lipstick_color_bgr = hex_to_bgr(lipstick_color) if lipstick_color else (0, 0, 255)
image_bgr = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
image_original = image_bgr.copy()
dets = detector(image_bgr, 1)
if len(dets) == 0:
return cv2.cvtColor(image_original, cv2.COLOR_BGR2RGB)
for k, d in enumerate(dets):
shape = predictor(image_bgr, d)
landmarks = np.array([(shape.part(i).x, shape.part(i).y) for i in range(68)])
left_eye = landmarks[36:42]
right_eye = landmarks[42:48]
eyeshadow_mask = np.zeros_like(image_bgr, dtype=np.uint8)
left_eye_hull = cv2.convexHull(left_eye)
right_eye_hull = cv2.convexHull(right_eye)
cv2.fillConvexPoly(eyeshadow_mask, left_eye_hull, eye_color_bgr)
cv2.fillConvexPoly(eyeshadow_mask, right_eye_hull, eye_color_bgr)
eyeshadow_mask = cv2.GaussianBlur(eyeshadow_mask, (15, 15), 0)
alpha = 0.4
image_bgr = cv2.addWeighted(image_bgr, 1, eyeshadow_mask, alpha, 0)
lips = landmarks[48:60]
lipstick_mask = np.zeros_like(image_bgr, dtype=np.uint8)
cv2.fillConvexPoly(lipstick_mask, cv2.convexHull(lips), lipstick_color_bgr)
lipstick_mask = cv2.GaussianBlur(lipstick_mask, (15, 15), 0)
image_bgr = cv2.addWeighted(image_bgr, 1, lipstick_mask, alpha, 0)
return cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)
# Gradio interface
iface = gr.Interface(
fn=apply_makeup,
inputs=[
gr.Image(type="numpy", label="Input Image"),
gr.ColorPicker(label="Eye Color"),
gr.ColorPicker(label="Lipstick Color")
],
outputs=gr.Image(type="numpy", label="Output Image")
)
iface.launch()