Python waitKey(0)和waitKey(1)的输出差异

Python waitKey(0)和waitKey(1)的输出差异,python,opencv,Python,Opencv,我刚刚开始使用Python的OpenCV库,遇到了一些我不理解的东西 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() #returns ret and the frame cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break 当我使用cv2.waitKey(1)时,我

我刚刚开始使用Python的OpenCV库,遇到了一些我不理解的东西

cap = cv2.VideoCapture(0)

while True:
      ret, frame = cap.read() #returns ret and the frame
      cv2.imshow('frame',frame)

      if cv2.waitKey(1) & 0xFF == ord('q'):
          break
当我使用
cv2.waitKey(1)
时,我会从笔记本电脑的网络摄像头中获得连续的实时视频。但是,当我使用
cv2.waitKey(0)
时,我会得到静止图像。每次我关上窗户,就会弹出另一扇窗户,上面还有当时拍的另一张照片。 为什么它不显示为连续馈送?

从中可以看到
cv2.waitKey(delay)
如果延迟为正,则等待延迟毫秒;如果延迟为零或负,则永远等待(无限期地等待键事件)。这就是为什么你会看到这些行为上的差异

cv2.waitKey(1)
的情况下,这实际上可以忽略不计,但它的使用为用户提供了按下一个键的机会(该键可能会在下一次迭代中被捕获,但不会产生很大的差异)。

来自:

1.
waitKey(0)
将无限显示窗口,直到按下任何键为止(它适用于图像显示)

2.
waitKey(1)
将显示一帧
1
ms,之后显示屏将自动关闭。由于操作系统在切换线程之间有一个最小的时间间隔,因此函数不会完全等待
1
ms,它将至少等待
1
ms,这取决于当时计算机上运行的其他程序

因此,如果您使用
waitKey(0)
您会看到一个静止图像,直到您实际按下
waitKey(1)
时,该函数将显示一个帧,时间至少为
1
ms。

waitKey(0)
将暂停屏幕,因为它将无限期地等待键盘上的按键,并且不会刷新帧(
cap.read()
)使用网络摄像头。
waitKey(1)
将等待按键仅1毫秒,它将继续刷新并使用
cap.read()
从网络摄像头读取帧

更清楚的是,在代码中使用调试器。当在while循环中使用
waitKey(0)
时,调试器从不跨越此语句,也不会刷新帧,因此帧输出看起来是稳定的。不会移动。 其中,对于
waitKey(1)
,调试器在

if cv2.waitKey(1) & 0xFF == ord('q')
1毫秒。

cv2。waitkey(1)用于while循环。它显示1毫秒的输出,但由于无限while循环,我们的大脑将图像序列视为一个连续视频


希望这有帮助。

延迟毫秒。0是表示“永远”的特殊值。 函数waitKey无限期地等待键事件(当\texttt{delay}\leq 0时)或延迟毫秒,当其为正时。由于操作系统在切换线程之间有一个最小时间间隔,因此函数不会完全延迟毫秒,它将至少延迟毫秒,具体取决于当时计算机上运行的其他程序。如果在指定时间之前未按任何键,则返回按下键的代码或-1后堂

注意:此函数是HighGUI中唯一可以获取和处理事件的方法,因此需要定期调用它以进行正常的事件处理,除非HighGUI在负责事件处理的环境中使用。 注意:只有在至少创建了一个HighGUI窗口且该窗口处于活动状态时,该功能才起作用。如果有多个HighGUI窗口,则其中任何一个都可以处于活动状态

是唯一一个清楚解释为什么会起作用的窗口,以及为什么在调用waitkey之前没有GUI事件起作用的窗口。不清楚如何处理菜单/鼠标事件-例如gnores菜单退出

$ python3
>>> import cv2
>>> im = cv2.imread("/tmp/portrait.jpg")
>>> print("im =", im)
im = […]
>>> cv2.imshow("image", im)
>>> print("imshow called")
imshow called
>>> print("waitKey =", cv2.waitKey(0))
waitKey = 32
>>> print("destroyAllWindows =", cv2.destroyAllWindows())
destroyAllWindows = None
>>> print("Final waitKey 1ms =", cv2.waitKey(1))
Final waitKey 1ms = -1
>>>