GLITCH-08's picture
Update app.py
8c3b674 verified
Raw
History Blame Contribute Delete
2.31 kB
import cv2
import mediapipe as mp
import numpy as np
import streamlit as st
from PIL import Image
# Streamlit Setup
st.set_page_config(page_title="AI Virtual Painter", layout="wide")
st.title("AI Virtual Painter")
st.sidebar.header("Settings")
# Sidebar Settings
draw_color = st.sidebar.color_picker("Select Drawing Color", "#FF0000")
thickness = st.sidebar.slider("Brush Thickness", 5, 50, 20)
clear_canvas = st.sidebar.button("Clear Canvas")
# Mediapipe Setup
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(min_detection_confidence=0.85, min_tracking_confidence=0.5, max_num_hands=1)
# Canvas Dimensions
width, height = 1280, 720
canvas = np.zeros((height, width, 3), np.uint8)
current_color = (255, 0, 0)
xp, yp = 0, 0 # Previous points
# Clear Canvas Logic
if clear_canvas:
canvas = np.zeros((height, width, 3), np.uint8)
# Webcam Feed
cap = cv2.VideoCapture(0) # Capture from webcam (camera index 0)
# Run Webcam
if cap.isOpened():
st.text("Press 'q' in the webcam feed window to quit.")
while True:
ret, frame = cap.read()
if not ret:
st.error("Failed to grab frame from webcam.")
break
# Flip and Convert Frame
frame = cv2.flip(frame, 1)
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Process Frame for Hand Landmarks
results = hands.process(rgb_frame)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
for id, lm in enumerate(hand_landmarks.landmark):
cx, cy = int(lm.x * width), int(lm.y * height)
# Tip of Index Finger
if id == 8:
if xp == 0 and yp == 0:
xp, yp = cx, cy
# Draw on Canvas
cv2.line(canvas, (xp, yp), (cx, cy), current_color, thickness)
xp, yp = cx, cy
# Combine Canvas and Frame
combined_frame = cv2.addWeighted(frame, 0.5, canvas, 0.5, 0)
# Display Frame with OpenCV
cv2.imshow("AI Virtual Painter", combined_frame)
# Break Loop with 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Cleanup
cap.release()
cv2.destroyAllWindows()
hands.close()