vikranth1111's picture
Update app.py
534fa54 verified
raw
history blame contribute delete
No virus
2.57 kB
import cv2
import gradio as gr
from cvzone.HandTrackingModule import HandDetector
from cvzone.ClassificationModule import Classifier
import numpy as np
import math
# Load HandDetector and Classifier
detector = HandDetector(maxHands=1)
classifier = Classifier("keras_model.h5", "labels.txt")
offset = 20
imgSize = 300
# Try different camera indices until a valid one is found
camera_index = 0
cap = None
while cap is None or not cap.isOpened():
cap = cv2.VideoCapture(camera_index)
if cap is None or not cap.isOpened():
camera_index += 1
print(f"Error: Could not open camera with index {camera_index - 1}. Trying index {camera_index}.")
if cap.isOpened():
print(f"Camera opened successfully with index {camera_index}.")
else:
print("Error: No valid camera index found.")
exit()
def classify_hand(img):
imgOutput = img.copy()
# Detect hands
hands, _ = detector.findHands(img)
if hands:
hand = hands[0]
x, y, w, h = hand['bbox']
imgWhite = np.ones((imgSize, imgSize, 3), np.uint8) * 255
imgCrop = img[y - offset:y + h + offset, x - offset:x + w + offset]
if imgCrop.size != 0:
imgCropShape = imgCrop.shape
aspectRatio = h / w
if aspectRatio > 1:
k = imgSize / h
wCal = math.ceil(k * w)
imgResize = cv2.resize(imgCrop, (wCal, imgSize))
imgResizeShape = imgResize.shape
wGap = math.ceil((imgSize - wCal) / 2)
imgWhite[:, wGap: wCal + wGap] = imgResize
else:
k = imgSize / w
hCal = math.ceil(k * h)
imgResize = cv2.resize(imgCrop, (imgSize, hCal))
imgResizeShape = imgResize.shape
hGap = math.ceil((imgSize - hCal) / 2)
imgWhite[hGap: hCal + hGap, :] = imgResize
# Get hand gesture prediction
prediction, index = classifier.getPrediction(imgWhite, draw=False)
# Draw bounding box and label
cv2.rectangle(imgOutput, (x - offset, y - offset - 70), (x - offset + 400, y - offset + 60 - 50), (0, 255, 0),
cv2.FILLED)
cv2.putText(imgOutput, labels[index], (x, y - 30), cv2.FONT_HERSHEY_COMPLEX, 2, (0, 0, 0), 2)
cv2.rectangle(imgOutput, (x - offset, y - offset), (x + w + offset, y + h + offset), (0, 255, 0), 4)
return imgOutput
iface = gr.Interface(fn=classify_hand, inputs='webcam', outputs='image', live=True)
iface.launch()