使用Python OpenCV模块中的事件在视频输出上进行点击响应
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
红色圆圈是在实时视频画面上绘制的,表示左击事件的发生。