我编写了一个小脚本,该脚本允许使用OpenCV运行/暂停视频流。我不明白为什么我需要以这种方式使用cv2.waitkey()。我的代码结构如下:
def marker(event, x, y, flags, param):
# Method called by mouse click
global run
if event == cv2.EVENT_LBUTTONDOWN:
run = not run
...
window_name = 'Editor Window'
cv2.namedWindow(window_name)
cv2.setMouseCallback(window_name, marker)
fvs = cv2.VideoCapture(args["video"])
(grabbed, frame) = fvs.read()
while grabbed:
# grab the frame from the threaded video file stream, resize
# it, and convert it to grayscale (while still retaining 3
# channels)
if run:
# Code to display video fames ...
cv2.waitKey(1) & 0xFF # Use A
(grabbed, frame) = fvs.read()
else:
cv2.waitKey(1) & 0xFF # Use B
代码对使用cv2.waitKey非常敏感:
如果我没有“ Use A”(使用A),则窗口将冻结,而不会显示视频。我希望它能够运行然后很快关闭。为什么不是这种情况?
如果不存在“ Use B”,则在第一次单击鼠标后冻结执行。 openCV是否需要以某种方式等待键盘输入才能看到鼠标单击?如果是这样,为什么?
如果“使用B”的延迟为0(即无限期等待),则似乎只能间歇性地看到鼠标单击事件,尽管有时我也会在单击时定期按空格键。为什么是这样?如果在按键之前(或之后)足够快地单击鼠标,我会以某种方式变得“幸运”吗?如果没有,为什么间歇性响应?
最终,我不太了解cv2.waitKey()的工作原理。我以为它会等待给定的键盘事件延迟,然后继续前进。鼠标单击的交互甚至使我感到困惑。
答案 0 :(得分:0)
waitKey驱动事件循环。这对于诸如键盘或鼠标事件之类的事情是必不可少的。因此,如果您期望交互式反应,则始终需要驱动它。
此外,您可以将waitKey拉到if前面,然后只需发出一次即可。
答案 1 :(得分:0)
函数waitKey无限等待键事件(当
delay
<= 0时),或者等待delay
毫秒(当它为正数)时。由于操作系统在切换线程之间的间隔时间最短,因此该功能将不会精确地等待delay
毫秒,而是将至少等待delay
毫秒,具体取决于当时计算机上正在运行的内容。它返回按下的键的代码;如果在指定的时间之前没有按下任何键,则返回-1。
因此,您可以使用OpenCV cv2.waitKey(delay)
函数,通过按下键盘的“ p”按钮来暂停,如下所示:
import cv2
cap = cv2.VideoCapture('your_video.mov')
while(True):
_, frame = cap.read()
cv2.imshow("Frame", frame)
key = cv2.waitKey(1)
if key == ord("p"):
cv2.waitKey(0)