OpenCV GUI PyQT-5

En tutoriales anteriores hemos estado viendo la biblioteca PyQT versión 5, usada para crear GUI en Python, también conocemos la biblioteca de procesamiento y análisis de imágenes OpenCV, ya que ambas tecnologías pueden ser usadas con el lenguaje Python veremos un ejemplo de como integrarlas.

opencv filtros pyqt

Para mostrar una imagen usando PyQT utilizaremos un control QLabel, usando el método setPixmap() establecemos la imagen que deseamos mostrar, la imagen será cargada usando cv2.imread() luego se procesará con las funciones OpenCV GaussianBlur y Canny, para presentarla en el QLabel debemos convertir la imagen OpenCV a un Pixmap.

Abrir Imagen con QFileDialog

Este cuadro de dialogo nos permite buscar archivos, lo usaremos para localizar la imagen que deseamos trabajar, cuando obtenemos la ruta de la imagen la abrimos con cv2.imread.

def abrirImagen(self):
    filename, _ = QFileDialog.getOpenFileName(None, 'Buscar Imagen', '.', 'Image Files (*.png *.jpg *.jpeg *.bmp)')
    if filename:
        self.image = cv2.imread(filename, cv2.IMREAD_UNCHANGED)
        self.mostrarImagen()

Al presionar el botón Procesar Imagen se aplican los algoritmos GaussianBlur y Canny para obtener una representación binaria de los bordes o contornos de la imagen seleccionada.

def procesarImagen(self):
     self.image = cv2.GaussianBlur(self.image, (5, 5), 0)
     self.image = cv2.Canny(self.image, 100, 200)
     self.mostrarImagen()

OpenCV Image a Pixmap

Para lograr mostrar la imagen OpenCV en PyQT debemos obtener un Pixmap, para crearlo requerimos de la siguiente información: ancho, alto y formato de color.

def mostrarImagen(self):
    size = self.image.shape
    step = self.image.size / size[0]
    qformat = QImage.Format_Indexed8

    if len(size) == 3:
        if size[2] == 4:
            qformat = QImage.Format_RGBA8888
        else:
            qformat = QImage.Format_RGB888

    img = QImage(self.image, size[1], size[0], step, qformat)
    img = img.rgbSwapped()

    self.label.setPixmap(QPixmap.fromImage(img))
    self.resize(self.label.pixmap().size())

Obtenemos el número de filas, columnas y canales que componen la imagen usando image.shape, si la imagen es a color se devolverá una tupla de 3 elementos, 2 en caso contrario.

Cuando la imagen tenga 1 canal usaremos el formato: Format_indexed8, con una imagen de 3 canales Format_RGB888 y para 4 canales Format_RGBA8888, existen muchas otras opciones de formatos, debemos agregarlas si deseamos manipular todo tipo de imágenes.

Finalizamos creando un objeto QImage con los datos requeridos, debemos llamar al método rgbSwapped() para intercambiar la información de color ya que OpenCV utiliza el formato BGR y el QImage utiliza RGB.

Por ultimo creamos el QPixmap a partir del QImage usando el método QPixmap.fromImage() y lo mostramos en el QLabel previamente creado.

Proyecto en GitHub: PyQT y OpenCV

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

Controles y Contenedores JavaFX 8 - I

Conectar SQL Server con Java

tkinter Canvas