我有几个视频,我想逐帧浏览它们,然后通过按键盘键(取决于帧)对其中一些进行注释。对于许多帧,我都不会按任何键。这是我到目前为止的内容:
import numpy as np
import cv2
cap = cv2.VideoCapture('video.mp4')
frame_number = []
annotation_list = []
i = 0
while(True):
# Read one frame.
ret, frame = cap.read()
# Show one frame.
cv2.imshow('frame', frame)
# Set the time between frames in miliseconds
c = cv2.waitKey(500)
i = i + 1
try:
annotation_list = annotation_list + [chr(c)]
frame_number = frame_number + [i]
except:
continue
因此,这将显示每个帧0.5秒,并与我按下按钮的每个帧相关联,即给定的字母。我现在需要的是这样一个选项,即对于给定的帧,我可以在需要的时间停止视频,例如按“空格”键,以考虑如何对其进行注释,然后按“空格”键。 ”(我决定如何注释后)再次继续播放视频。如何添加此暂停/继续选项?谢谢!
您可以通过从cv2.waitKey()
的返回值确定按下了哪个键来实现暂停/恢复功能。要暂停视频,您可以不向cv2.waitKey()
传递任何参数(或0),该参数将无限期等待直到按下某个键,然后它将恢复视频。从docs:
cv2.waitKey()
是键盘绑定功能。它的参数是时间(以毫秒为单位)。该函数将为任何键盘事件等待指定的毫秒数。如果在此期间按任意键,程序将继续。如果传递0,它将无限期地等待击键。还可以将其设置为检测特定的按键,例如是否按下键a等,我们将在下面讨论。
要确定是否按下空格键,我们可以检查返回的值是否为32
。如果按下此键,则我们将无限期暂停帧,直到按下任何键,然后我们才能恢复视频。这是一个例子:
import cv2
cap = cv2.VideoCapture('video.mp4')
if not cap.isOpened():
print("Error opening video")
while(cap.isOpened()):
status, frame = cap.read()
if status:
cv2.imshow('frame', frame)
key = cv2.waitKey(500)
if key == 32:
cv2.waitKey()
elif key == ord('q'):
break
将来如果您想在按下某个键后执行某些操作,则可以使用此脚本确定“键码”:
import cv2
# Load a test image
image = cv2.imread('1.jpg')
while(True):
cv2.imshow('image', image)
key = cv2.waitKey(1)
# 'q' to stop
if key == ord('q'):
break
# Print key
elif key != -1:
print(key)