有没有办法在不显示窗口的情况下使用 cv2.waitkey() ?
Posted
技术标签:
【中文标题】有没有办法在不显示窗口的情况下使用 cv2.waitkey() ?【英文标题】:Is there a way to use cv2.waitkey() without showing the window? 【发布时间】:2021-03-08 06:30:06 【问题描述】:我关注了this program tutorial,它捕获了屏幕并将其放入视频文件中。按下“q”按钮时记录停止。但是,我不想在迷你窗口中显示屏幕而直接写入文件。我只是在调用教程中显示的 while 循环,除了我没有包括关于将图像显示到“实时”窗口的部分。现在当我使用时:
while True:
img = pyautogui.screenshot()
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out.write(np.array(frame))
# cv2.imshow('Live', frame)
if cv2.waitKey(1) == ord('q'):
print('done')
break
它不会检测到我按 q。这里发生了什么?当我按 q 时,循环应该停止吗?我只是得到一个 44 位 mp4 文件作为最终结果。我认为这可能是因为我没有使用 imshow 所以 waitkey 不会做任何事情,但我不确定。有没有办法让它在按键时停止录制?
【问题讨论】:
【参考方案1】:除非有窗口,否则waitKey()
很可能什么都不做,因为它可能与窗口键事件处理程序有关。
如果您使用的是 Windows,您可以尝试 msvcrt.kbhit()
,这是一个非阻塞调用,用于请求是否在控制台上按下了某个键并且可以读取。
在其他平台上,以非阻塞方式等待按键可能并非易事。
【讨论】:
当我调用它时,即使我按下一个键,它似乎也不会返回 True。是否有一个特定的文本框我必须按下它才能返回一些东西?我从同一个模块中听说了一个叫做 getch 的东西,它返回按下的确切键,但我不确定这是否对我有帮助 不是文本框,而是您的应用运行的控制台窗口。如果您在 IDE 或其他设备中运行,getch()
可能不起作用。【参考方案2】:
我认为,您的假设是正确的,因为您没有启动显示(即 cv2.imshow()),因此 cv2.watikey() 不起作用。由于您的目标是停止按键录制,我认为您可以遵循此link's 建议。 或者试试这个模式:
try:
while True:
break
#replace break with your code
except KeyboardInterrupt:
print("Press Ctrl-C to terminate while statement")
pass
【讨论】:
当我运行代码时,窗口停止响应。真的不知道为什么会这样。 没关系,因为我运行的是 IDE 程序仍然冻结,mp4 仍然是空白,但键盘中断工作正常 好吧,我做了一些挖掘,视频没有被正确写入,因为我在 out 变量中指定的帧大小不是我的屏幕分辨率。我还使用了另一个名为键盘的模块来检查按键,因为我并没有真正制作控制台应用程序。 帧数还是不一致以上是关于有没有办法在不显示窗口的情况下使用 cv2.waitkey() ?的主要内容,如果未能解决你的问题,请参考以下文章
vscode中有没有办法在不保存文件的情况下启用语法突出显示? [复制]
Google Sheet Script:有没有办法在不停止脚本的情况下显示消息?