使用 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): # 检查鼠标左键是否被点击 if event == cv2.EVENT_LBUTTONDOWN: print("left click") cv2.imshow("Current Frame for left click", frame) # 检查鼠标右键是否被点击 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: # 给出错误信息 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
红色圆圈表示在实时视频片段上发生左键单击事件的位置。