Mostrando uma imagem na tela com a API OpenCV 2.x no Python

Enquanto apresentar imagens na tela é uma tarefa extremamente fácil utilizando-se a biblioteca de imagens PIL (Python Imaging Library) para Python, ao utilizar o OpenCV, as coisas não são tão simples.

As funções para implementar a interface com o usuário no OpenCV estão concentradas no módulo highgui.

Para apresentar uma imagem na tela, os passos básicos são:

  1. Ter uma imagem carregada na memória: pode ser uma imagem lida a partir de um arquivo através comando cv2.imread, ou um array numpy que você mesmo criou.
  2. Criar uma janela utilizando o comando cv2.namedWindow("Nome")
  3. Utilizar o comando cv2.imshow("Nome",imagem)
  4. E, finalmente, utilizar o comando cv2.waitKey()

Se você seguir estes passos, você provavelmente verá sua imagem apresentada na tela, mas o problema é que nem tudo será perfeito.
Ao tentar fechar a janela que apresenta a imagem, você provavelmente terá uma mensagem de erro ou o seu shell ficará travado, e você será obrigada(o) a reiniciá-lo.

O problema é que o OpenCV espera que você implemente um administrador de eventos da janela, que garantirá que as coisas funcionarão de uma maneira pré-definida.

A função abaixo mostra como uma tecla (no caso, a tecla ESC) pode ser utilizada para fechar a imagem e garantir que você retome o domínio do shell.

#================================================
#               imdisplay
#
# Show image and waits for ESC key. (CV2)
#================================================
def imdisplay(cv2_im):
    import cv2
    cv2.namedWindow('show')
    cv2.imshow('show',cv2_im)
    while True:
        ch=0xFF & cv2.waitKey()
        if ch==27: # ESC key
            break
        cv2.imshow('show',cv2_im)
    cv2.destroyWindow('show')
    return

Uma dica que pode ajudar: se você está apresentando a imagem na tela e ela aparece totalmente branca ou escura e você tem certeza que a matriz correspondente à sua imagem tem valores entre 0 e 255, cheque o datatype da sua matriz. Apesar da documentação atual do OpenCV (2.4.6) informar que a função imshow é capaz de lidar com matrizes de diferentes tipos, tais como float e int32, aparentemente isto não está funcionando adequadamente no Python. Para resolver o problema, garanta primeiramente que os pixels da sua matriz tenham valores normalizados entre 0 e 255 e transforme o datatype da sua matriz para uint8.

Esta conversão, utilizando o Numpy, pode ser realizada da seguinte maneira:

import numpy as np
# Cria uma matriz 5x5 para fins de demonstração
a=np.asarray(range(25))
a=np.reshape(a,(5,5))

# Muda o tipo dos dados da matriz para unsigned int 8
a= a.astype(np.uint8)
Anúncios

Deixe seu comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s