使用OpenCV和Python中的事件处理视频输出的点击响应


OpenCV是一个基于Python的开源计算机视觉库。它提供了许多函数来执行各种图像或视频处理操作。该库使用Python的NumPy模块将所有视频或图像数组表示为ndarray类型。

在本文中,我们将学习如何使用Python OpenCV模块中的事件来检测视频输出上的点击响应。

为了识别在视频输出上发生的鼠标事件,我们将使用以下鼠标事件:

  • cv2.EVENT_LBUTTONDOWN:表示左键按下

  • cv2.EVENT_RBUTTONDOWN:表示右键按下

此外,我们将使用setMouseCallback()函数为指定的窗口设置鼠标事件处理程序。

setMouseCallback()函数

此函数用于指定哪个函数必须为特定窗口调用。换句话说,此函数为指定的窗口创建鼠标事件处理程序。以下是其语法:

cv2.setMouseCallback(winname, onMouse, userdata)

其中:

  • Winname:特定窗口的名称。

  • OnMouse:鼠标事件的回调函数。

  • Userdata:传递给回调函数的可选参数。

在视频文件上

cv2.VideoCapture()函数将读取视频文件数据。在这里,我们将定义一个鼠标回调函数来识别视频输出的点击响应。

示例

让我们来看一个检测视频输出上发生哪个点击事件的例子。

import cv2
  
def check_mouse_event(event, x, y, flags, param):
   # to check if left mouse button was clicked
   if event == cv2.EVENT_LBUTTONDOWN:
      print("left click")
      cv2.imshow("Current Frame for left click", frame)
   
   # to check if right mouse button was clicked
   if event == cv2.EVENT_RBUTTONDOWN:
      print("right click")
      cv2.imshow("Current Frame for Right click", frame)  

cap = cv2.VideoCapture("Videos/blue-tit-2975.mp4")
  
if cap.isOpened() == False:
   # give error message
   print("Error in opening file.")
else:
   while(cap.isOpened()):
      ret, frame = cap.read()
      if ret == True:
         cv2.imshow("Input Window", frame)
         cv2.setMouseCallback('Input Window', check_mouse_event, param=frame)
         if cv2.waitKey(10) & 0xFF == ord('q'):
               break
      else:
         break

cap.release()
cv2.destroyAllWindows()

输入窗口

输出 - 左键点击

输出 - 右键点击

显示了发生左键和右键点击事件的输入视频文件的当前帧。

在实时视频上

在所有函数中,我们还使用namedWindow()函数创建一个窗口,该窗口可用于复制图像和轨迹条的位置。如果已存在同名窗口,则该函数不会复制/执行任何操作。以下是此函数的语法:

cv.namedWindow(winname[, flags])

其中:

  • Winname:指定窗口的名称。

  • Flags:用于指定窗口标志。

示例

在这个例子中,我们将在左键按下处绘制一个半径为10的红色圆圈。

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
color = (0,0,255) #red color
line_width = 2
radius = 10
point = (0,0)
def click(event, x, y, flags, param):
   global point, pressed
   if event == cv2.EVENT_LBUTTONDOWN:
      print("left button Pressed at {},{} co-ordinates".format(x,y))
      point = (x,y)
        
cv2.namedWindow("live video")
cv2.setMouseCallback("live video",click)
while(True):
   ret, frame = cap.read()
   frame = cv2.resize(frame, (0,0), fx=0.5,fy=0.5)
   cv2.circle(frame, point, radius, color, line_width)
   cv2.imshow("live video",frame)
   
   if cv2.waitKey(1) & 0xFF == ord('q'):
      break
cap.release()
cv2.destroyAllWindows()

输出

left button Pressed at 29,36 co-ordinates
left button Pressed at 27,44 co-ordinates
left button Pressed at 150,82 co-ordinates
left button Pressed at 178,36 co-ordinates 

红色圆圈绘制在发生左键点击事件的实时视频画面上。

更新于:2023年5月30日

344 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告