Virtual notepad using opencv
virtual notepad using OpenCV involves detecting hand gestures or finger movements to draw on a virtual canvas. Below is a simple example that tracks a specific color (e.g., the tip of a finger) to draw on a canvas. You can use this basic approach as a foundation for more complex implementations.
Step 1: Install Required Libraries
pip install opencv-python numpy
Step 2: Write the Virtual Notepad Code
import cv2import numpy as np
# Function to detect a specific color (e.g., the tip of a colored marker or finger) in the frame
def detect_color(frame, lower_color, upper_color):
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_frame, lower_color, upper_color)
return mask
# Initialize the webcam
cap = cv2.VideoCapture(0)
# Define the range of the color you want to track (e.g., blue)
lower_blue = np.array([100, 150, 0])
upper_blue = np.array([140, 255, 255])
# Create a blank image for the notepad
canvas = np.zeros((480, 640, 3), dtype=np.uint8)
# Previous x, y position of the point
prev_x, prev_y = None, None
while True:
ret, frame = cap.read()
if not ret:
break
# Flip the frame to avoid mirror effect
frame = cv2.flip(frame, 1)
# Detect the color in the frame
mask = detect_color(frame, lower_blue, upper_blue)
# Find contours in the mask
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# If any contour is found, consider it as the point to draw
if contours:
# Find the largest contour by area
largest_contour = max(contours, key=cv2.contourArea)
((x, y), radius) = cv2.minEnclosingCircle(largest_contour)
# Draw if the detected contour is large enough
if radius > 10:
if prev_x is not None and prev_y is not None:
# Draw a line on the canvas
cv2.line(canvas, (prev_x, prev_y), (int(x), int(y)), (255, 0, 0), 5)
# Update previous positions
prev_x, prev_y = int(x), int(y)
# Combine the frame and canvas
combined = cv2.addWeighted(frame, 0.5, canvas, 0.5, 0)
# Display the result
cv2.imshow("Virtual Notepad", combined)
# Clear the canvas when 'c' is pressed
if cv2.waitKey(1) & 0xFF == ord('c'):
canvas = np.zeros((480, 640, 3), dtype=np.uint8)
prev_x, prev_y = None, None
# Break the loop when 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Release the resources
cap.release()
cv2.destroyAllWindows()
How the Code Works:
- Color Detection: The
detect_color
function converts the video frame to HSV color space and applies a mask to detect a specific color. In this example, we’re tracking a blue color. - Contours: The code finds contours in the masked image and selects the largest contour to represent the drawing point.
- Drawing: As the detected point moves, the previous and current positions are connected with a line on the canvas.
- Canvas: A blank image (
canvas
) is used as the drawing surface, which is combined with the live video feed to display the drawing. - Reset and Exit: Press 'c' to clear the canvas or 'q' to exit the application.
Step 3: Run the Code
When you run the code, a window will open showing the live feed from your webcam. You can use an object (like a blue pen) to draw on the virtual canvas. Press 'c' to clear the canvas and 'q' to quit the application.
Notes:
- You can adjust the
lower_blue
andupper_blue
values to track a different color or fine-tune the current color detection. - This example uses a simple color-based approach for drawing. For more advanced gesture recognition, you can integrate hand-tracking models.
Comments
Post a Comment