Imshow 命令在 opencv-python 中不能正常工作

我使用的是 opencv2.4.2和 python2.7 下面的简单代码创建了一个正确名称的窗口,但其内容是空白的,没有显示图像:

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)

有人知道这件事吗?

292343 次浏览

imshow()只能与 waitKey()一起工作:

import cv2
img = cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow', img)
cv2.waitKey()

(更新窗口所需的整个消息循环都隐藏在其中。)

我也面临同样的问题。我试图从 IDLE 读取一个图像,并试图使用 cv2.imshow()显示它,但显示窗口冻结并显示 pythonw.exe在试图关闭窗口时没有响应。

下面的帖子给出了一个可能的解释,为什么会发生这种情况

Python.exe 没有响应

基本上,不要在 IDLE 中这样做。编写一个脚本,如果在窗口中,则直接从 shell 或脚本运行它,方法是使用。然后双击它。IDLE 自己的事件循环与 GUI 工具包中的事件循环之间显然存在冲突。

当我在脚本中使用 imshow()并执行它,而不是直接在 IDLE 上运行它时,它起作用了。

我在这里找到了适合我的答案: Http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

如果您运行交互式 ipython 会话,并希望使用 highgui Windows,首先执行 cv2.startWindowThread ()。

详细说明: HighGUI 是一个显示图像和 它应该像下面这样简单:

import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)

你必须在 cv2.imshow("window",img)之后使用 cv2.waitKey(0)。只有这样它才能工作。

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

你已经掌握了所有必要的线索:

if cv2.waitKey(): cv2.destroyAllWindows()

我在空闲时间工作很好。

如果你没有让这个工作,你最好把

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

放到一个文件中,然后运行它。

如果您选择使用“ cv2.waitKey (0)”,请确保您已经编写了“ cv2.waitKey (0)”而不是“ cv2.waitKey (0)”,因为小写的“ k”可能也会冻结您的程序。

错误: (- 215) size. width > 0 & & size. height > 0 in function imshow

这个误差是因为没有找到图像而产生的,所以不是显示函数的误差。

最后加入 cv2.waitKey(0)

如果您在 Python 控制台中运行,请执行以下操作:

img = cv2.imread("yourimage.jpg")


cv2.imshow("img", img); cv2.waitKey(0); cv2.destroyAllWindows()

然后,如果您按下图像上的 Enter,它将成功地关闭图像,您可以继续运行其他命令。

对于我来说,如果数字大于0,就可以使用 waitKey ()

    cv2.waitKey(1)

我也有同样的215错误,我能够通过给出图像的完整路径来克服这个错误,如 C: Folder1 Folder2 filename.ext

我还出现了一个 -215错误。我认为 imshow 是问题所在,但是当我将 imread 改为读取一个不存在的文件时,我没有发现任何错误。因此,我将图像文件放在工作文件夹中,并添加了 cv2.waitKey (0) ,它就工作了。

不需要任何额外的方法后 waitKey(0)(答复以上代码)

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)
cv2.waitKey(0)

窗口出现-> 单击窗口 & 单击回车。窗口将关闭。

方法一:

下面的代码对我很有用。 仅仅添加 demuryAllWindows ()并没有关闭窗口,而是在最后添加了另一个 cv2.waitKey (1)。

im = cv2.imread("./input.jpg")
cv2.imshow("image", im)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

来源: https://stackoverflow.com/a/50091712/8109630

初学者须知:

  • 这将在一个单独的窗口中打开图像,而不是在笔记本上内联显示。这就是为什么我们必须在以后关闭它时使用 demuryAllWindows ()的原因。
  • 因此,如果你没有看到一个单独的窗口弹出,检查它是否在你当前的窗口后面。
  • 查看图像后,按一个键关闭弹出窗口。

方法二:

如果你想显示在木星笔记本上。

from matplotlib import pyplot as plt
import cv2


im = cv2.imread("./input.jpg")
color = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
plt.imshow(color)
plt.title('Image')
plt.show()

我是这样解决的:

import cv2
from matplotlib import pyplot
    

img = cv2.imread('path')
pyplot.imshow(img)
pyplot.show()

这个解决了我的问题 import pyautogui

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)
cv2.destroyAllwindows()

你可以试试这个代码:)

对于64位系统来说,为了防止错误,可以使用这一端 cv2.waitKey (1) add 0xFF。

例如:

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0) & 0xFF
cv2.destroyAllwindows()

您还可以使用以下命令通过按 Q 按钮停止程序来获得更多控制。

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
if cv2.waitKey(0) & 0xFF == ord('Q'):
break
cv2.destroyAllwindows()

如果您仍然希望在查看图片时访问控制台。 您还可以传递一个图像列表,这些图像将一个接一个地显示出来。

from threading import Thread
from typing import Union
import numpy as np
import cv2
from time import sleep




def imshow_thread(
image: Union[list, np.ndarray],
window_name: str = "",
sleep_time: Union[float, int, None] = None,
quit_key: str = "q",
) -> None:
r"""
Usage:


import glob
import os
from z_imshow import add_imshow_thread_to_cv2 #if you saved this file as z_imshow.py
add_imshow_thread_to_cv2() #monkey patching
import cv2
image_background_folder=r'C:\yolovtest\backgroundimages'
pics=[cv2.imread(x) for x in glob.glob(f'{image_background_folder}{os.sep}*.png')]
cv2.imshow_thread( image=pics[0], window_name='screen1',sleep_time=None, quit_key='q') #single picture
cv2.imshow_thread( image=pics, window_name='screen1',sleep_time=.2, quit_key='e') #sequence of pics like a video clip


Parameters:
image: Union[list, np.ndarray]
You can pass a list of images or a single image
window_name: str
Window title
(default = "")
sleep_time: Union[float, int, None] = None
Useful if you have an image sequence.
If you pass None, you will have to press the quit_key to continue
(default = None)
quit_key: str = "q"
key to close the window
Returns:
None


"""
t = Thread(target=_cv_imshow, args=(image, window_name, sleep_time, quit_key))
t.start()




def _cv_imshow(
cvimages: Union[list, np.ndarray],
title: str = "",
sleep_time: Union[float, int, None] = None,
quit_key: str = "q",
) -> None:


if not isinstance(cvimages, list):
cvimages = [cvimages]


if sleep_time is not None:
for cvimage in cvimages:
cv2.imshow(title, cvimage)
if cv2.waitKey(1) & 0xFF == ord(quit_key):
break
sleep(sleep_time)
else:
for cvimage in cvimages:
cv2.imshow(title, cvimage)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.destroyAllWindows()




def add_imshow_thread_to_cv2():
cv2.imshow_thread = imshow_thread  # cv2 monkey patching
# You can also use imshow_thread(window_name, image, sleep_time=None)
# if you dont like monkey patches