我刚刚开始将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)时,却获得了静态图像。每次我关闭窗户时,都会弹出另一个窗口,并同时显示另一张照片。为什么它不显示为连续供稿?
答案 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窗口,则其中任何一个都可以处于活动状态