【问题标题】:Python OpenCV - waitKey(0) does not respond?Python OpenCV - waitKey(0) 没有响应?
【发布时间】:2020-06-17 00:19:55
【问题描述】:

我在 ubuntu 12.04 上使用 opencv 2.4.7。我正在使用 python 编程,但在运行此脚本时遇到问题:

import cv2

img = cv2.imread('347620923614738322_233985812.jpg')
cv2.namedWindow("window")
cv2.imshow("window", img)
cv2.waitKey(0)

问题是当我关闭图像时脚本不会停止。我搜索了有关waitKey 的信息,发现使用cv2.waitKey(0) 是正确的。

我不明白,问题出在哪里?

【问题讨论】:

  • “脚本不要停止” - 你是什么意思?它应该停止,如果你按下一个键(但当你点击“关闭”按钮时可能不会)
  • 我按了一个键,脚本没有停止
  • 您是否关闭了窗口,然后按了某个键?还是您在窗口打开时按下了键?
  • 我关闭窗户,然后按下一个键。
  • @berak 我在 MacOS 上,我只是按一个键,脚本不会继续执行。为什么 ?根据文档,waitKey(0) 将等待任何按键,无需手动关闭窗口。

标签: python opencv ubuntu-12.04


【解决方案1】:

我发现如果我在窗口处于焦点时按下键,它会起作用。如果命令行是焦点,那么什么都不会发生

【讨论】:

  • 这当然有效......当你从命令行提示符运行程序时
  • 有人知道如何从 CLI 停止吗? Ctrl + C 在那里什么都不做。
  • 我已经关闭了图片窗口,但是python shell没有响应
【解决方案2】:

在这种情况下,在销毁窗口后添加 cv2.waitKey(1) 应该可以工作。

cv2.imshow('imgae',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

【讨论】:

  • 你拯救了我的一天!非常感谢!
【解决方案3】:

这段代码在 IDLE 中适用于我:

# -*- coding: utf-8 -*-

# Objectif : découvrir le fonctionnement d'opencv-python
# http://opencv-python-tutroals.readthedocs.org/en/latest/index.html


import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('Lena.tiff',0)
WINDOW_NAME = 'Image de Lena'
cv2.namedWindow(WINDOW_NAME, cv2.CV_WINDOW_AUTOSIZE)
cv2.startWindowThread()

# Display an image
cv2.imshow(WINDOW_NAME,img)
cv2.waitKey(0) 


cv2.destroyAllWindows()

希望这对未来的读者有所帮助。

【讨论】:

  • 如果你是Mac用户,请按照腾龙的回答,在cv2.destroyAllWindows()后面加cv2.waitKey(1)
  • cv2.destroyAllWindows() 工作正常。谢谢你的回答。
  • 如果 imshow 被注释掉并且我们想在退出时使用 ctrl+c 或任何其他键保存视频怎么办?
【解决方案4】:

点击图像窗口(活动)然后按和键,不要在终端窗口中写入。

【讨论】:

    【解决方案5】:

    这里是在所有平台上获得最佳性能的简约代码:

    import cv2
    
    img = cv2.imread("image.jpg")
    cv2.imshow("Window", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    现在一些观察

    当用户想要通过按下0关闭窗口时,他/她必须确保按下0 键而窗口是焦点。因为如上所述,如果终端处于焦点位置,则不会发生任何事情并且代码执行会停留在cv2.waitKey(0),直到在窗口处于焦点位置时正确按下0 键。

    在窗口处于焦点时按下0是关闭窗口并确保的正确方法,一旦窗口在cv2.destroyAllWindows() 行中被销毁并且程序结束, 用户可以取回对终端的控制权

    如果通过鼠标点击退出窗口,窗口会被销毁,是的,但是用户很可能会遇到无法取回对终端的控制权的情况。在这种情况下,用户可能想要关闭无响应的终端并打开一个新终端。

    【讨论】:

      【解决方案6】:

      尝试直接从终端执行脚本对我来说 100% 有效但不是从 IDE 举例,我解释说: 我正在使用fedora 20并遇到了同样的问题,从官方opencv python教程中复制了第一个示例,我正在使用:

      • Fedora 20 64 位
      • 适用于 python 的 Spyder IDE
      • Python 版本 2.7.5
      • Fedora 64 位
      • OpenCV 2.4.7

      这是测试代码

      import cv2
      img = cv2.imread('/path/image1.jpeg',0)
      cv2.imshow('Display',img)
      cv2.waitKey(0)
      cv2.destroyAllWindows()
      

      当使用 Spyder 中的 F5 运行此脚本时,它使用嵌入式 python 终端运行它:

      runfile('/home/user/Workspace/test.py', wdir=r'/home/user/Workspace')
      

      在这种情况下,cv2.waitKey(0) 或 cv2.waitKey(-1) 不起作用,并且在使用示例代码按下键后窗口仍然打开 尝试关闭窗口将导致“无响应,强制退出”警报 但是从终端执行脚本时,它可以 100% 工作

      没有找到问题的根源,如果我找到它会更新。

      【讨论】:

        【解决方案7】:

        在Ubuntu下通过[运行]->[每个文件的配置]->[在外部系统终端中执行]解决了。

        【讨论】:

        • 你救了我!谢谢
        【解决方案8】:

        那么使用cv2.waitKeyEx(0)。

        它以相同的方式运行并等待您的响应,直到您将其撤消。

        我希望它有所帮助。 尼泰什·瓦尔玛

        【讨论】:

          【解决方案9】:

          cv2.waitKey(0) 表示脚本处于无限循环中,循环后等待 0 毫秒 .只有指定的键才能停止它。

          您没有指定应用程序结束条件。

          试试这个代码: Using other keys for the waitKey() function of opencv

          【讨论】:

            【解决方案10】:

            基于 unix 的系统从 python 笔记本运行 opencv 程序存在问题。

            检查这个替代方法我的建议是在终端中的 python 中运行代码。你不会遇到任何问题

            复制相同的代码并用 filename.py 保存

            import cv2
            input = cv2.imread('path_to_image.png')
            cv2.imshow('Hello World', input)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
            

            然后打开特定目录,然后打开终端

            步骤:

            Open Terminal
            cd path/to/filename.py
            source activate YOURPROFILE 
            python filename.py
            

            这会解决问题

            https://youtu.be/8O-FW4Wm10s

            【讨论】:

              【解决方案11】:

              即使您使用窗口上的十字按钮关闭窗口,这也会起作用。

              import numpy as np
              import cv2
              
              img = cv2.imread('arvid.jpg', 0)
              cv2.namedWindow('image', cv2.WINDOW_NORMAL)
              cv2.imshow('image', img)
              
              while True:
                  k = cv2.waitKey(30) & 0xFF
                  if k == 27:         # wait for ESC key to exit
                      cv2.destroyAllWindows()
                  elif k == ord('s'):  # wait for 's' key to save and exit
                      cv2.imwrite('arvid2.jpg', img)
                      cv2.destroyAllWindows()
                  if cv2.getWindowProperty("image", 0) == -1:
                      break
              

              【讨论】:

              • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
              • @RumitPatel 已修复
              【解决方案12】:

              这个问题出现在一些早期版本的opencv中。 所以你只需要将opencv更新到最新版本。版本4.0.0.21 为我工作。 使用下面的命令。

              update opencv to version 4.0.0.21.

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-09-03
                • 2013-06-27
                • 2017-11-12
                • 2017-12-15
                • 2016-06-12
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多