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.