dev / app.py
Dzsysop's picture
webcam - switch to webrtc gradio
9ea7598
import cv2
import numpy as np
import gradio as gr
from gradio_webrtc import WebRTC
# Load face detector
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
def process_frame(frame: np.ndarray) -> np.ndarray:
if frame is None:
return frame
frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
gray = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray, scaleFactor=1.1, minNeighbors=5, minSize=(60, 60)
)
for (x, y, w, h) in faces:
mask_height = int(h * 0.4)
mask_y = y + int(h * 0.2)
# black mask
cv2.rectangle(frame_bgr, (x, mask_y), (x + w, mask_y + mask_height), (0, 0, 0), -1)
# eyes
eye_y = mask_y + int(mask_height * 0.5)
eye_radius = int(w * 0.1)
cv2.circle(frame_bgr, (x + int(w * 0.35), eye_y), eye_radius, (255, 255, 255), -1)
cv2.circle(frame_bgr, (x + int(w * 0.65), eye_y), eye_radius, (255, 255, 255), -1)
# Z
cv2.putText(
frame_bgr, "Z",
(x + w - 30, y + h - 20),
cv2.FONT_HERSHEY_SIMPLEX,
1.5,
(0, 0, 255),
3
)
return cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)
# UI
with gr.Blocks() as demo:
gr.Markdown("# 🎭 Real-time Zorro Mask (WebRTC)")
webrtc = WebRTC()
webrtc.stream(
fn=process_frame,
inputs=webrtc,
outputs=webrtc,
)
demo.launch()