El comando cv2.imshow no funciona correctamente en opencv-python


111

Estoy usando opencv 2.4.2, python 2.7 El siguiente código simple creó una ventana con el nombre correcto, pero su contenido está en blanco y no muestra la imagen:

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

¿Alguien sabe sobre este tema?


La ruta de su archivo puede ser incorrecta. Windows usa \ not /. No estoy seguro de si OpenCV tolera / en Windows. Si solucionarlo no ayuda, asegúrese de que su imagen esté en la ubicación correcta y sea una imagen válida.
fmw42

Hay un tutorial con los conceptos básicos de lectura / visualización de imágenes en docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon psych

Respuestas:


228

imshow()solo funciona con waitKey():

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

(Todo el bucle de mensajes necesario para actualizar la ventana está oculto allí).


3
check print imgimprime una matriz numérica correcta, no un NoneTypeobjeto.
Abid Rahman K

7
Para que quede claro para la posteridad, en circunstancias normales, esta sería la respuesta correcta. Omitir waitKey (normalmente) dará como resultado exactamente el comportamiento descrito en la pregunta.
Snesticle

45

Encontré la respuesta que me funcionó aquí: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Si ejecuta una sesión ipython interactiva y desea usar ventanas highgui, primero haga cv2.startWindowThread ().

En detalle: HighGUI es una interfaz simplificada para mostrar imágenes y videos del código OpenCV. Debería ser tan fácil como:

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

7
Puede cerrarlo después por cv2.destroyAllWindows ()
Zuza

Para la implementación QT de highgui, startWindowThread () no hace nada. github.com/opencv/opencv/blob/…
kusi

24

Debes usar cv2.waitKey(0)después cv2.imshow("window",img). Solo entonces funcionará.

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

Agregaría que es posible que deba instalar el IDE de Python para mostrar la imagen y también debe buscar la ventana que a veces no la muestra al frente. El paréntesis en cv2.waitKey () supongo que está en milsegundos y si lo deja en blanco, mostrará la imagen para siempre.
Ahmadiah

11

Si está ejecutando dentro de una consola de Python, haga esto:

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

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

Luego, si presiona Enterla imagen, la cerrará con éxito y podrá continuar ejecutando otros comandos.


7

Me enfrenté al mismo problema. Intenté leer una imagen de IDLE y traté de mostrarla usando cv2.imshow(), pero la ventana de visualización se congela y muestra pythonw.exeque no responde al intentar cerrar la ventana.

La publicación a continuación ofrece una posible explicación de por qué está sucediendo esto.

pythonw.exe no responde

" Básicamente, no hagas esto desde IDLE. Escribe un script y ejecútalo desde el shell o el script directamente si está en Windows, nombrándolo con una extensión .pyw y haciendo doble clic en él. Aparentemente, hay un conflicto entre el propio evento de IDLE loop y los de los kits de herramientas de la GUI " .

Cuando lo usé imshow()en un script y lo ejecuté en lugar de ejecutarlo directamente sobre IDLE, funcionó.


Agregue la explicación proporcionada en el enlace (como mínimo) porque los enlaces pueden quedar obsoletos ... Gracias :)
achedeuzot

Bump ya que este es el problema que tengo pero ... "no hagas esto" no es la respuesta que estoy buscando =)
Eric


4

Para mí, waitKey () con un número mayor que 0 funcionó

    cv2.waitKey(1)

3

Tienes todas las piezas necesarias en algún lugar de este hilo:

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

funciona bien para mí en IDLE.


3

Si no ha hecho que esto funcione, es mejor que ponga

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

en un archivo y ejecútelo.


1

No necesita ningún método adicional después waitKey(0)(responda para el código anterior)

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

Aparece la ventana -> Haga clic en la ventana y haga clic en Entrar. La ventana se cerrará.


0

Si eliges usar "cv2.waitKey (0)", asegúrate de haber escrito "cv2.waitKey (0)" en lugar de "cv2.waitkey (0)", porque esa "k" minúscula también puede congelar tu programa. .


3
El método con la clave en minúsculas no existe en la API. El código arrojaría un error ya que el método no existe.
rayryeng

0

También tuve un error -215. Pensé que imshow era el problema, pero cuando cambié imread para leer en un archivo inexistente no obtuve ningún error allí. Así que puse el archivo de imagen en la carpeta de trabajo y agregué cv2.waitKey (0) y funcionó.


-1

error: (-215) size.width> 0 && size.height> 0 en la función imshow

Este error se produce porque no se encuentra la imagen. Entonces no es un error de la función imshow.


No es relevante para esta pregunta.
rayryeng

-1

Tuve el mismo error 215, que pude superar dando la ruta completa a la imagen, como en C: \ Folder1 \ Folder2 \ filename.ext


¿Qué "mismo error 215"? En ninguna parte de la pregunta de OP se menciona ningún error. Además, OP está usando una ruta completa a la imagen, por lo que no veo cómo esto responde a la pregunta.
Max Vollmer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.