Proyecto opencv en qt

Luego de haber configurado nuestro proyecto qt para usar las librerías de opencv, vamos desde luego a aprender cómo crear una aplicación sencilla en la que crearemos una ventana, abriremos una imagen la procesaremos y mostraremos la imagen original más la procesada.

En este punto ya debemos tener configurado nuestro proyecto si no lo has hecho mira cómo hacerlo aquí.

En la carpeta Form veremos el archivo mainwindow.ui, le damos doble clic para editarlo con el diseñador de qt.

Lo primero que haremos será cambiar el tamaño de la ventana, para ello seleccionamos la ventana y en el panel de propiedades ubicamos la propiedad geometry y establecemos sus valores de esta manera:


Lo siguiente que haremos será agregar un botón al que llamaremos abrir y dos etiquetas a las que llamaremos original y nueva.


Para cambiar el nombre de los objetos que acabamos de agregar hacemos clic derecho – Change objectName… y cambiamos los nombres a los mencionados anteriormente, también podemos cambiar el nombre que muestra el objeto haciendo clic derecho – Change text… para el botón y Change plain text… para las etiquetas, hacemos las modificaciones necesarias para que quede de este modo:


Con esto tendremos preparada nuestra interfaz gráfica de usuario, ahora para darle funcionalidad haremos que al darle clic al botón abra un cuadro para buscar una imagen, para hacer esto hacemos clic derecho sobre el botón – Go to slot… y seleccionamos clicked().


Esta acción nos creara una función llamada on_abrir_clicked en el archivo mainwindow.cpp que se ejecutara cada vez que hagamos clic en el botón.

La primera funcionalidad que demos programas es la de abrir un cuadro de dialogo para buscar una imagen en nuestro sistema de archivo. El siguiente código hace este trabajo debemos agregar #include <QFileDialog> para que funcione.


QString fileName = QFileDialog::getOpenFileName(this,
                                                tr("Open Image"), ".",
                                                tr("Image Files (*.png *.jpg *.jpeg *.bmp)")); 

Lo siguiente que debemos hacer es convertir la matriz (Mat) que contiene nuestra imagen a la clase QImage, luego el objeto QImage lo usaremos para obtener un QPixmap que le asignaremos a la etiqueta donde mostraremos la imagen, este es un ejemplo del código:

const uchar *qImage2 = (const uchar*)org.data;
QImage img2(qImage2, org.cols, org.rows, org.step, QImage::Format_RGB888);
ui->original->setPixmap(QPixmap::fromImage(img2.rgbSwapped()));

Además debemos agregar los archivo de inclusión requeridos por opencv, el siguiente fragmento de código abre la imágenes con opencv la procesa y la muestra en las etiquetas que ya hemos creado. 

Este es el código completo de la función on_abrir_clicked:

void MainWindow::on_abrir_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this,
                                                    tr("Open Image"), ".",
                                                    tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));
    Mat mat = imread(fileName.toStdString());

    if(!mat.empty())
    {
        QSize sz = ui->original->frameSize();
        cv::resize(mat, mat, Size(sz.width(), sz.height()));

        Mat org = mat.clone();

        GaussianBlur(mat, mat, Size(11,7), 1.5);
        Canny(mat, mat, 0, 30, 3);

        const uchar *qImage1 = (const uchar*)mat.data;
        const uchar *qImage2 = (const uchar*)org.data;

        QImage img1(qImage1, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        QImage img2(qImage2, org.cols, org.rows, org.step, QImage::Format_RGB888);

        ui->nueva->setPixmap(QPixmap::fromImage(img1.rgbSwapped()));
        ui->original->setPixmap(QPixmap::fromImage(img2.rgbSwapped()));
    }
    else
        std::cout << "No se ha cargado - " << fileName.toStdString() << std::endl;
}

Debemos recordar agregar los namespace para opencv y los include necesarios más información, si por algún motivo al ejecutar nuestra aplicación nos da error podemos probar borrando la carpeta build del proyecto para iniciar la construcción desde cero.


Puedes descargar el código aquí.

Comentarios

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API