Click response on video output using Events in OpenCV and Python

OpenCV is an Open Source Computer Vision Library in Python that provides numerous functions for image and video processing operations. It uses NumPy arrays to represent video and image data efficiently.

In this article, we will learn how to handle mouse click events on video output using OpenCV's event handling system. This allows us to create interactive video applications that respond to user clicks.

Mouse Events in OpenCV

OpenCV provides several mouse event constants to detect different types of mouse interactions ?

  • cv2.EVENT_LBUTTONDOWN: Left mouse button is pressed

  • cv2.EVENT_RBUTTONDOWN: Right mouse button is pressed

  • cv2.EVENT_MBUTTONDOWN: Middle mouse button is pressed

  • cv2.EVENT_MOUSEMOVE: Mouse cursor moves over the window

The setMouseCallback() Function

The setMouseCallback() function registers a mouse event handler for a specific window. When a mouse event occurs, the specified callback function is executed.

Syntax

cv2.setMouseCallback(winname, onMouse, userdata)

Parameters

  • winname: Name of the window to attach the callback

  • onMouse: Callback function that handles mouse events

  • userdata: Optional parameter passed to the callback function

Click Events on Video Files

You can detect mouse clicks on video frames by using cv2.VideoCapture() to read video data and setting up a mouse callback function ?

Example

import cv2

def check_mouse_event(event, x, y, flags, param):
    # Check if left mouse button was clicked
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f"Left click at coordinates: ({x}, {y})")
        cv2.imshow("Left Click Frame", frame)
    
    # Check if right mouse button was clicked
    if event == cv2.EVENT_RBUTTONDOWN:
        print(f"Right click at coordinates: ({x}, {y})")
        cv2.imshow("Right Click Frame", frame)

# Create a sample video using webcam (replace with your video file)
cap = cv2.VideoCapture(0)  # Use 0 for webcam or provide video file path

if not cap.isOpened():
    print("Error: Cannot open video source")
else:
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            cv2.imshow("Video Window", frame)
            cv2.setMouseCallback('Video Window', check_mouse_event)
            
            # Press 'q' to quit
            if cv2.waitKey(30) & 0xFF == ord('q'):
                break
        else:
            break

cap.release()
cv2.destroyAllWindows()

Interactive Live Video with Visual Feedback

This example creates an interactive live video where clicking draws a red circle at the clicked position ?

Example

import cv2

# Global variables
click_point = (0, 0)
circle_color = (0, 0, 255)  # Red color (BGR format)
circle_radius = 15
line_thickness = 3

def mouse_click_handler(event, x, y, flags, param):
    global click_point
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f"Left button pressed at ({x}, {y})")
        click_point = (x, y)

# Initialize webcam
cap = cv2.VideoCapture(0)
cv2.namedWindow("Interactive Live Video")
cv2.setMouseCallback("Interactive Live Video", mouse_click_handler)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    # Resize frame for better display
    frame = cv2.resize(frame, (640, 480))
    
    # Draw circle at clicked point
    if click_point != (0, 0):
        cv2.circle(frame, click_point, circle_radius, circle_color, line_thickness)
    
    cv2.imshow("Interactive Live Video", frame)
    
    # Press 'q' to quit, 'c' to clear circle
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('c'):
        click_point = (0, 0)  # Clear the circle

cap.release()
cv2.destroyAllWindows()

Key Features

  • Click anywhere on the video to draw a red circle

  • Press 'c' to clear the circle

  • Press 'q' to exit the application

  • Coordinates are printed to the console when clicking

Advanced Mouse Event Handling

You can create more sophisticated interactions by handling multiple event types ?

import cv2
import numpy as np

# Global variables for drawing
drawing = False
points = []

def advanced_mouse_handler(event, x, y, flags, param):
    global drawing, points
    
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        points = [(x, y)]
        print(f"Started drawing at ({x}, {y})")
    
    elif event == cv2.EVENT_MOUSEMOVE and drawing:
        points.append((x, y))
    
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        print(f"Finished drawing at ({x}, {y})")

cap = cv2.VideoCapture(0)
cv2.namedWindow("Advanced Mouse Events")
cv2.setMouseCallback("Advanced Mouse Events", advanced_mouse_handler)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    frame = cv2.resize(frame, (640, 480))
    
    # Draw the path
    if len(points) > 1:
        for i in range(1, len(points)):
            cv2.line(frame, points[i-1], points[i], (255, 0, 0), 3)
    
    cv2.imshow("Advanced Mouse Events", frame)
    
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('c'):
        points = []  # Clear drawing

cap.release()
cv2.destroyAllWindows()

Conclusion

Mouse event handling in OpenCV enables interactive video applications where users can click to trigger actions or draw on video frames. Use setMouseCallback() to register event handlers and process different mouse events like clicks and movements for creating engaging computer vision applications.

Updated on: 2026-03-27T06:52:34+05:30

602 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements