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?

top.eng
fuente
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í).

Berak
fuente
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)
Akhorus
fuente
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)
AdityaIntwala
fuente
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.

Dharma
fuente
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ó.

rkdasari
fuente
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
7

agregar cv2.waitKey(0)al final.

Pygirl
fuente
4

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

    cv2.waitKey(1)
Rambod
fuente
3

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

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

funciona bien para mí en IDLE.

iamchriskelley
fuente
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.

Joseph
fuente
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á.

Ravi Chandra Veeramachaneni
fuente
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. .

Guilherme Girão
fuente
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ó.

Departamento de Circulación
fuente
-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.

Alvaro Fernandez
fuente
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

user3458364
fuente
¿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