Python OpenCV - waitKey(0) 没有响应?

问题描述 投票:0回答:14

我在 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)
是正确的。

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

python opencv ubuntu-12.04
14个回答
59
投票

我发现如果我在窗口处于焦点状态时按下该键,它就会起作用。如果命令行处于焦点状态,则什么也不会发生


18
投票

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

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

15
投票

此代码在 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()

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


14
投票

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


7
投票

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

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()
行中被销毁并且程序结束,用户可以取回终端控制

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


1
投票

尝试直接执行脚本从终端工作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%工作

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


1
投票

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


1
投票

那么使用 cv2.waitKeyEx(0)。

它以同样的方式运行并等待您的响应,直到您撤销它。

我希望它有帮助。 Nithesh varmma


0
投票

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

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

试试这个代码: 使用其他按键进行opencv的waitKey()函数


0
投票

基于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


0
投票

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

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

0
投票

这个问题出现在一些早期版本的opencv中。 所以你只需要将opencv更新到最新版本即可。版本

4.0.0.21
对我有用。 使用下面的命令。

update opencv to version 4.0.0.21.


0
投票

我也遇到了同样的问题,直到我在
cv2.destroyAllWindows()
下面添加了
cv2.waitkey(0)

对于上下文,我正在 RaspberryPi 上运行用于相机系统的 python 程序。

在满足

cv2.destroyAllWindows()
(按下一个键)后,使用
cv2.waitkey(0)
关闭(或“销毁”)创建的窗口,立即关闭窗口并允许我的程序继续运行(就像我期望的程序一样)做)。

如果没有

cv2.destroyAllWindows()
,当程序到达 waitkey(0) 行时,按键看起来不会执行任何操作;有时通过终端发送终止信号,甚至不会终止进程,我必须通过按显示窗口右上角的“x”手动发送一个信号。

我希望这有帮助。


-1
投票

代码没有任何问题。 可能是图像文件已被显示。 JB 单元左侧的 * 符号将一直亮起,直到您单击关闭显示的图像。

© www.soinside.com 2019 - 2024. All rights reserved.