O comando cv2.imshow não funciona corretamente em opencv-python

111

Estou usando opencv 2.4.2, python 2.7 O código simples a seguir criou uma janela com o nome correto, mas seu conteúdo está em branco e não mostra a imagem:

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

alguém sabe sobre esse assunto?

top.eng
fonte
O caminho do seu arquivo pode estar errado. O Windows usa \ não /. Não tenho certeza se o OpenCV tolera / no Windows? Se consertar isso não ajudar, certifique-se de que sua imagem esteja no local correto e seja uma imagem válida.
fmw42
Há um tutorial com os conceitos básicos de leitura / exibição de imagens em docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon psych

Respostas:

228

imshow()só funciona com waitKey():

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

(Todo o ciclo de mensagens necessário para atualizar a janela está oculto lá.)

Berak
fonte
3
check print imgimprime uma matriz numpy correta, não um NoneTypeobjeto.
Abid Rahman K de
7
Só para deixar claro para a posteridade, em circunstâncias normais essa seria a resposta correta. A omissão de waitKey (geralmente) resultará exatamente no comportamento descrito na pergunta.
Snesticle,
45

Encontrei a resposta que funcionou para mim aqui: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Se você executar uma sessão ipython interativa e quiser usar janelas highgui, execute cv2.startWindowThread () primeiro.

Em detalhes: HighGUI é uma interface simplificada para exibir imagens e vídeo do código OpenCV. Deve ser tão fácil quanto:

import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)
Akhorus
fonte
7
Você pode fechá-lo depois em cv2.destroyAllWindows ()
Zuza
Para a implementação QT de highgui, startWindowThread () não faz nada. github.com/opencv/opencv/blob/…
kusi
24

Você deve usar cv2.waitKey(0)depois cv2.imshow("window",img). Só então funcionará.

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)
AdityaIntwala
fonte
Eu acrescentaria que você pode precisar instalar o IDE do python para exibir a imagem e também deve procurar a janela, às vezes ela não a exibe na frente. O parêntese em cv2.waitKey () presumo que esteja em milsegundos e se você deixar em branco, a imagem será exibida para sempre.
Ahmadiah,
11

Se você estiver executando em um console Python, faça o seguinte:

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

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

Então, se você pressionar Enterna imagem, ele irá fechar a imagem com sucesso e você poderá continuar executando outros comandos.

Dharma
fonte
7

Eu enfrentei o mesmo problema. Tentei ler uma imagem do IDLE e tentei exibi-la usando cv2.imshow(), mas o visor congela e mostra que pythonw.exenão está respondendo ao tentar fechar a janela.

A postagem abaixo fornece uma possível explicação de por que isso está acontecendo

pythonw.exe não está respondendo

" Basicamente, não faça isso no IDLE. Escreva um script e execute-o a partir do shell ou o script diretamente no Windows, nomeando-o com uma extensão .pyw e clicando duas vezes nele. Aparentemente, há um conflito entre o próprio evento do IDLE loop e os dos kits de ferramentas da GUI. "

Quando usei imshow()um script e o executei em vez de executá-lo diretamente no IDLE, funcionou.

rkdasari
fonte
Por favor, adicione a explicação fornecida no link (no mínimo) porque os links podem ficar obsoletos ... Obrigado :)
achedeuzot
Bump, pois este é o problema que eu tenho, mas ... "não faça isso" não é a resposta que estou procurando =)
Eric
7

adicione cv2.waitKey(0)no final.

Pygirl
fonte
4

Para mim, waitKey () com número maior que 0 funcionou

    cv2.waitKey(1)
Rambod
fonte
3

Você tem todas as peças necessárias em algum lugar neste tópico:

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

funciona bem para mim no IDLE.

iamchriskelley
fonte
3

Se você não fez isso funcionar, é melhor colocar

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

em um arquivo e execute-o.

Joseph
fonte
1

Não precisa de nenhum método adicional após waitKey(0)(resposta para o código acima)

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

A janela aparece -> Clique na janela e clique em Enter. A janela será fechada.

Ravi Chandra Veeramachaneni
fonte
0

Se você escolher usar "cv2.waitKey (0)", certifique-se de ter escrito "cv2.waitKey (0)" em vez de "cv2.waitkey (0)", porque o "k" minúsculo também pode congelar seu programa .

Guilherme Girão
fonte
3
O método com a chave em minúsculas não existe na API. O código geraria um erro, pois o método não existe.
rayryeng
0

Eu também tive um erro -215. Achei que o problema era imshow, mas quando mudei o imread para ler um arquivo inexistente, não obtive nenhum erro. Então coloquei o arquivo de imagem na pasta de trabalho e adicionei cv2.waitKey (0) e funcionou.

CirculationDept
fonte
-1

erro: (-215) size.width> 0 && size.height> 0 na função imshow

Este erro é produzido porque a imagem não foi encontrada. Portanto, não é um erro da função imshow.

Alvaro Fernandez
fonte
Não é relevante para esta questão.
rayryeng
-1

Eu tive o mesmo erro 215, que fui capaz de superar fornecendo o caminho completo para a imagem, como em C: \ Pasta1 \ Pasta2 \ nome do arquivo.ext

user3458364
fonte
O que "mesmo erro 215"? Em nenhuma parte da questão dos OPs é mencionado qualquer erro. Além disso, o OP está usando um caminho completo para a imagem, então não vejo como isso responde à pergunta.
Max Vollmer