使用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
红色圆圈绘制在发生左键点击事件的实时视频画面上。
广告