有没有办法在不显示窗口的情况下使用 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:有没有办法在不停止脚本的情况下显示消息?

如何在不显示窗口的情况下运行 PowerShell 脚本?

有没有办法在不导入的情况下显示图像? [复制]

有没有办法在不实际 ping 用户的情况下提及用户(蓝色突出显示)?

有没有办法在不开始滚动的情况下显示 UITextView 的滚动指示器?