Spaces:
Sleeping
Sleeping
from fastapi import FastAPI | |
from fastapi.responses import StreamingResponse | |
import cv2 | |
import numpy as np | |
import mediapipe as mp | |
from collections import deque | |
import io | |
app = FastAPI() | |
# Initialize your variables and settings here | |
bpoints = [deque(maxlen=1024)] | |
gpoints = [deque(maxlen=1024)] | |
rpoints = [deque(maxlen=1024)] | |
ypoints = [deque(maxlen=1024)] | |
blue_index = 0 | |
green_index = 0 | |
red_index = 0 | |
yellow_index = 0 | |
kernel = np.ones((5, 5), np.uint8) | |
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 255, 255)] | |
colorIndex = 0 | |
paintWindow = np.zeros((471, 636, 3)) + 255 | |
cap = cv2.VideoCapture(0) | |
# Initialize Mediapipe | |
mpHands = mp.solutions.hands | |
hands = mpHands.Hands(max_num_hands=1, min_detection_confidence=0.7) | |
mpDraw = mp.solutions.drawing_utils | |
def video_feed(): | |
def generate(): | |
while True: | |
ret, frame = cap.read() | |
if not ret: | |
continue | |
# Your frame processing logic goes here | |
frame = process_frame(frame) | |
_, buffer = cv2.imencode('.jpg', frame) | |
frame = buffer.tobytes() | |
yield (b'--frame\r\n' | |
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') | |
return StreamingResponse(generate(), media_type='multipart/x-mixed-replace; boundary=frame') | |
def process_frame(frame): | |
global blue_index, green_index, red_index, yellow_index | |
global bpoints, gpoints, rpoints, ypoints, paintWindow, colorIndex | |
frame = cv2.flip(frame, 1) | |
framergb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
frame = cv2.rectangle(frame, (40, 1), (140, 65), (0, 0, 0), 2) | |
frame = cv2.rectangle(frame, (160, 1), (255, 65), (255, 0, 0), 2) | |
frame = cv2.rectangle(frame, (275, 1), (370, 65), (0, 255, 0), 2) | |
frame = cv2.rectangle(frame, (390, 1), (485, 65), (0, 0, 255), 2) | |
frame = cv2.rectangle(frame, (505, 1), (600, 65), (0, 255, 255), 2) | |
cv2.putText(frame, "CLEAR", (49, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA) | |
cv2.putText(frame, "BLUE", (185, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA) | |
cv2.putText(frame, "GREEN", (298, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA) | |
cv2.putText(frame, "RED", (420, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA) | |
cv2.putText(frame, "YELLOW", (520, 33), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA) | |
result = hands.process(framergb) | |
if result.multi_hand_landmarks: | |
landmarks = [] | |
for handslms in result.multi_hand_landmarks: | |
for lm in handslms.landmark: | |
lmx = int(lm.x * 640) | |
lmy = int(lm.y * 480) | |
landmarks.append([lmx, lmy]) | |
mpDraw.draw_landmarks(frame, handslms, mpHands.HAND_CONNECTIONS) | |
fore_finger = (landmarks[8][0], landmarks[8][1]) | |
center = fore_finger | |
thumb = (landmarks[4][0], landmarks[4][1]) | |
cv2.circle(frame, center, 3, (0, 255, 0), -1) | |
if (thumb[1] - center[1] < 30): | |
bpoints.append(deque(maxlen=512)) | |
blue_index += 1 | |
gpoints.append(deque(maxlen=512)) | |
green_index += 1 | |
rpoints.append(deque(maxlen=512)) | |
red_index += 1 | |
ypoints.append(deque(maxlen=512)) | |
yellow_index += 1 | |
elif center[1] <= 65: | |
if 40 <= center[0] <= 140: # Clear Button | |
bpoints = [deque(maxlen=512)] | |
gpoints = [deque(maxlen=512)] | |
rpoints = [deque(maxlen=512)] | |
ypoints = [deque(maxlen=512)] | |
blue_index = 0 | |
green_index = 0 | |
red_index = 0 | |
yellow_index = 0 | |
paintWindow[67:, :, :] = 255 | |
elif 160 <= center[0] <= 255: | |
colorIndex = 0 # Blue | |
elif 275 <= center[0] <= 370: | |
colorIndex = 1 # Green | |
elif 390 <= center[0] <= 485: | |
colorIndex = 2 # Red | |
elif 505 <= center[0] <= 600: | |
colorIndex = 3 # Yellow | |
else: | |
if colorIndex == 0: | |
bpoints[blue_index].appendleft(center) | |
elif colorIndex == 1: | |
gpoints[green_index].appendleft(center) | |
elif colorIndex == 2: | |
rpoints[red_index].appendleft(center) | |
elif colorIndex == 3: | |
ypoints[yellow_index].appendleft(center) | |
else: | |
bpoints.append(deque(maxlen=512)) | |
blue_index += 1 | |
gpoints.append(deque(maxlen=512)) | |
green_index += 1 | |
rpoints.append(deque(maxlen=512)) | |
red_index += 1 | |
ypoints.append(deque(maxlen=512)) | |
yellow_index += 1 | |
points = [bpoints, gpoints, rpoints, ypoints] | |
for i in range(len(points)): | |
for j in range(len(points[i])): | |
for k in range(1, len(points[i][j])): | |
if points[i][j][k - 1] is None or points[i][j][k] is None: | |
continue | |
cv2.line(frame, points[i][j][k - 1], points[i][j][k], colors[i], 2) | |
cv2.line(paintWindow, points[i][j][k - 1], points[i][j][k], colors[i], 2) | |
return frame | |