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

时间:2018-07-02 20:42:05

标签: python opencv

我刚刚开始将OpenCV库用于Python,并且遇到了我不了解的东西。

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)时,却获得了静态图像。每次我关闭窗户时,都会弹出另一个窗口,并同时显示另一张照片。为什么它不显示为连续供稿?

6 个答案:

答案 0 :(得分:2)

从文档-https://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html?highlight=waitkey

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

2。waitKey(1)将显示一帧,持续1 ms,此后显示将自动关闭

因此,如果您使用waitKey(0)会看到一幅静止图像,直到您实际按下waitKey(1)的内容为止,该功能只会显示1毫秒的帧。

答案 1 :(得分:1)

Indratej Reddy's answer 是唯一一个清楚地解释了为什么它起作用的人 - 以及为什么在调用 waitkey 之前没有 GUI 事件起作用。不清楚如何处理菜单/鼠标事件——例如,忽略菜单退出。

$ 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
>>> 

答案 2 :(得分:0)

documentation中可以看到,如果cv2.waitKey(delay)为正,delay等待延迟毫秒,但是如果(如果等待,则无限地等待)按键事件它是零或负数。这就是为什么您会看到这些行为上的差异。

cv2.waitKey(1)的情况下,这可以忽略不计,但是它的使用为用户提供了按下键的机会(该键可能会在下一次迭代中被捕获,但不会造成错误)。

答案 3 :(得分:0)

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

更清楚地,在代码中使用调试器。在while循环中使用waitKey(0)时,调试器永远不会越过该语句,也不会刷新框架,因此框架输出看起来很稳定。 与waitKey(1)一样,调试器将在

暂停后将代码交叉
if cv2.waitKey(1) & 0xFF == ord('q')

持续1毫秒。

答案 4 :(得分:0)

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

希望这会有所帮助。

答案 5 :(得分:0)

延迟(以毫秒为单位)。 0是表示“永远”的特殊值。 函数waitKey无限等待键事件(当\ texttt {delay} \ leq 0时),或者等待正数时延迟毫秒。由于操作系统在切换线程之间的时间最短,因此该功能将不会等待确切的延迟毫秒,而是将至少等待延迟毫秒,具体取决于当时计算机上正在运行的其他东西。它返回按下的键的代码;如果在指定的时间过去之前没有按下任何键,则返回-1。

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