Saltar al contenido

OpenCV: cerrar la ventana de visualización de imágenes

Basta ya de buscar por todo internet porque llegaste al lugar justo, contamos con la respuesta que buscas sin complicarte.

Solución:

Para propósitos de prueba, el la aplicación a continuación hace exactamente lo que indicó en la pregunta: carga 7 imágenes a través de la línea de comando, una por una, y crea una nueva ventana para cada imagen a mostrar.

Funciona perfectamente con OpenCV 2.3.1 en Linux.

#include 
#include 

#define NUM_IMGS 7

int main(int argc, char* argv[])

    if (argc < 8)
    
        printf("Usage: %s 
n", argv[0]); return -1; // Array to store pointers for the images IplImage* images[NUM_IMGS] = 0 ; for (int i = 0; i < NUM_IMGS; i++) // load image images[i] = cvLoadImage(argv[i+1], CV_LOAD_IMAGE_UNCHANGED); if (!images[i]) printf("!!! failed to load: %sn", argv[i+1]); continue; // display image in a window cvNamedWindow(argv[i+1], CV_WINDOW_AUTOSIZE); // creating a new window each time cvShowImage(argv[i+1], images[i]); // wait for keypress cvWaitKey(0); // close the window cvDestroyWindow(argv[i+1]); cvReleaseImage(&images[i]); return 0;

cvDestroyWindow() generalmente solo comienza procedimiento bastante complicado de destrucción de ventanas. Este procedimiento requiere cierta interacción (intercambio de eventos) entre el sistema de ventanas y su aplicación. Hasta que finalice este procedimiento, la ventana no se puede destruir por completo. Esa es la razón por la que ve una ventana parcialmente destruida mientras su aplicación realiza algo que no está relacionado con la GUI.

El intercambio de eventos se puede realizar de manera dependiente del sistema. En Windows esto significa (directa o indirectamente) llamar GetMessage o MsgWaitFor* funciones y procesamiento del resultado. Para Unixes esto significa (directa o indirectamente) llamar XNextEvent y procesando el resultado.

OpenCV permite realizar este intercambio de eventos de forma independiente del sistema. Hay dos métodos documentados para hacer esto. el primero es cvWaitKey() (solo llama cvWaitKey(1) después de cerrar la última imagen). La segunda es llamar cvStartWindowThread() al comienzo de su programa para permitir que OpenCV actualice sus ventanas automáticamente.

Solo uno de estos métodos funcionó correctamente en mi caja de Linux con libcv2.1: cvStartWindowThread().


Actualizar (fragmento de código con cvStartWindowThread())

//gcc -std=c99 main.c -lcv -lcxcore -lhighgui
#include 
#include 
#include 
#include 

#define NUM_IMGS 2

int main(int argc, char* argv[])

    if (argc < 2)
    
        printf("Usage: %s n", argv[0]);
        return -1;
    

    cvStartWindowThread();

    // Array to store pointers for the images
    IplImage* images[NUM_IMGS] =  0 ;

    for (int i = 0; i < NUM_IMGS; i++)
    
        // load image
        images[i] = cvLoadImage(argv[i+1], CV_LOAD_IMAGE_UNCHANGED);
        if (!images[i])
        
            printf("!!! failed to load: %sn", argv[i+1]);
            continue;
        

        // display image in a window
        cvNamedWindow(argv[i+1], CV_WINDOW_AUTOSIZE); // creating a new window each time
        cvShowImage(argv[i+1], images[i]);

        // wait for keypress
        cvWaitKey(0);

        // close the window
        cvDestroyWindow(argv[i+1]);
        cvReleaseImage(&images[i]);
    

    //    cvWaitKey(1);
    sleep(10);
    return 0;

No hay necesidad de destruir la ventana en cada marco, simplemente puede llamar a cvShowImage() con el mismo nombre de ventana y reemplazará la imagen actual.

Solo necesita llamar a la ventana de destrucción al apagar. Puede usar cvCreateWindow() para crear la ventana al inicio, pero se creará automáticamente en la primera llamada a showWindow().

Si eres capaz, eres capaz de dejar un artículo acerca de qué te ha parecido esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *