Hand Gesture Control Using OpenCV and Cvzone | Python Project by Akash Vishwakarma

Hand Gesture Control Using OpenCV and Cvzone | Python Project by Akash Vishwakarma

8.9K views
Summary
Hey I am Akash Vishwakarma in this article I am gonna show you hand detection system using python with opencv library. This is an open source library which you can use to detect multiple hand gestures.

In this article, we will explore how to use a webcam and hand gestures to control the keyboard in real-time. By detecting specific hand gestures, you can trigger keyboard shortcuts. We will be using Python, OpenCV, and the cvzone library to achieve this. Let's get started!

Prerequisites

Before diving into the code, ensure you have the following installed:

  • Python installed on your system. You can download it from the official Python website.
  •    
  • OpenCV library for Python: OpenCV allows us to work with webcam data and image processing tasks.
  •    
  • cvzone library: A higher-level module for hand detection based on OpenCV and mediapipe.
  •    
  • Keyboard library: For simulating keyboard presses based on detected gestures.

 

 

Setting Up the Environment

To begin, you'll need to install the required libraries. Open a terminal or command prompt and run the following commands:

pip install opencv-python
pip install cvzone
pip install keyboard

Understanding the Code

The following code captures frames from your webcam, detects hand gestures, and simulates keyboard key presses based on specific hand movements.

Code Explanation:

import cv2
import cvzone
from cvzone.HandTrackingModule import HandDetector
import keyboard
  •    
  • cv2 is used to capture and display video frames from the webcam.
  •    
  • cvzone provides the HandDetector class, which uses mediapipe to detect hand gestures.
  •    
  • keyboard allows us to simulate key presses based on gestures.

Webcam Initialization:

cap = cv2.VideoCapture(1)
detector = HandDetector(detectionCon=0.8, maxHands=2)
  •    
  • cv2.VideoCapture(1) initializes the webcam. If you have a single webcam, use 0 instead of 1.
  •    
  • HandDetector initializes hand tracking with a detection confidence of 0.8 and allows detection of up to two hands.

Gesture Recognition:

In each frame, the code detects if a hand is present and tracks its gestures:

if hands:
    for hand in hands:
        handType = hand["type"]
        fingers = detector.fingersUp(hand)
  •    
  • The code checks if a hand is detected. If so, it loops through all detected hands.
  •    
  • hand["type"] identifies if the hand is "Left" or "Right".
  •    
  • detector.fingersUp(hand) returns a list representing the state of each finger (1 if raised, 0 if not).

Keyboard Control Based on Gestures:

if handType == "Left":
    if fingers == [1, 1, 1, 1, 1]:
        if not left_hand_one_finger_raised:
            keyboard.press_and_release('f8')
  •    
  • If the left hand is detected and all fingers are raised, it simulates pressing the F8 key using the keyboard library.

Displaying Gesture Information:

To provide real-time feedback on the gesture detected, the code displays the current gesture status on the webcam frame:

cv2.putText(img, gesture_status, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Hand Gesture Control", img)
  •    
  • cv2.putText writes the gesture status on the frame at position (10, 50).
  •    
  • cv2.imshow displays the frame in a window titled "Hand Gesture Control".

Loop and Exit Condition:

The program continuously processes frames until the 'q' key is pressed to exit the loop:

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

Running the Program

To run this program, ensure your webcam is connected. Then, execute the Python script by running:

python hand_gesture_control.py

Wave your hand in front of the webcam, and based on the gesture, the corresponding key press (like F8 or Space) will be triggered. Press 'q' to exit the program.

Conclusion

This tutorial demonstrates how to create a real-time hand gesture control system using Python, OpenCV, and cvzone. You can expand this further by adding more gestures and corresponding actions, creating a robust gesture-based control system for various applications.

Full Code:

import cv2
import cvzone
from cvzone.HandTrackingModule import HandDetector
import keyboard

# Initialize the webcam
cap = cv2.VideoCapture(1)
detector = HandDetector(detectionCon=0.8, maxHands=2)  # Allow detecting both hands

# State variables to track the current gesture states
left_hand_one_finger_raised = False
right_hand_open = False

while True:
    # Get the frame from the webcam
    success, img = cap.read()
    if not success:
        break

    # Detect hands
    hands, img = detector.findHands(img)

    # Initialize gesture status
    gesture_status = "No hand detected"

    if hands:
        for hand in hands:
            handType = hand["type"]  # 'Left' or 'Right'
            fingers = detector.fingersUp(hand)

            if handType == "Left":
                # Check if only the index finger is raised
                if fingers == [1, 1, 1, 1, 1]:  # Index finger raised
                    if not left_hand_one_finger_raised:
                        keyboard.press_and_release('f8')
                        gesture_status = "Left hand - One finger raised - F8 pressed and released"
                        left_hand_one_finger_raised = True
                else:  # No fingers or multiple fingers raised
                    left_hand_one_finger_raised = False

            if handType == "Right":
                # Check if the hand is open
                if fingers == [1, 1, 1, 1, 1]:  # Open hand
                    if not right_hand_open:
                        keyboard.press_and_release('space')
                        gesture_status = "Right hand - Hand open - Space pressed and released"
                        right_hand_open = True
                else:  # Hand is closed or other gesture
                    right_hand_open = False

    # Display gesture status on the frame
    cv2.putText(img, gesture_status, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # Display the frame
    cv2.imshow("Hand Gesture Control", img)

    # Break the loop if 'q' is pressed
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release the webcam and close windows
cap.release()
cv2.destroyAllWindows()