Sto facendo su un progetto per la ricerca attraverso un database di immagini, e quando trovo i risultati per alcune query - 5 immagini di database, vorrei visualizzare i risultati visivamente. Non conservo tutte le immagini in memoria, quindi devo caricare prima l'immagine per visualizzarla.OpenCV - chiusura della finestra di visualizzazione dell'immagine
ho avuto qualcosa di semplice in mente, in pseudocodice:
for image 1..5
load images
display image in a window
wait for any keypress
close the window
Ecco un frammento del mio codice in C++
usando OpenCV
per questo scopo:
IplImage *img;
for (int i=0; i < 5; ++i){
img = cvLoadImage(images[i].name.c_str(),1);
cvShowImage(("Match" + images[i].name).c_str(), img);
cvWaitKey(0);
cvDestroyWindow(("Match" + images[i].name).c_str());
// sleep(1);
cvReleaseImage(&img);
}
L'array images
usata qui non lo fa come tale esiste nel mio codice, ma per il gusto della domanda, contiene i nomi file delle immagini relative al punto corrente del programma corrente se è membro name
. Memorizzo i nomi delle immagini in modo leggermente diverso nel mio progetto.
Il codice di cui sopra quasi lavori: posso scorrere 4/5 immagini OK, ma quando viene visualizzata l'ultima immagine e si preme un tasto, l'immagine diventa grigio e non riesco a chiudere la finestra dell'immagine tecnico senza schiantarsi il resto della mia domanda.
La mia prima idea è stata che, a causa delle ottimizzazioni in fase di compilazione, cvReleaseImage
rilascia l'immagine prima del cvDestroyWindow
e che in qualche modo la blocchi. Ma, ho provato ad aggiungere un po 'di attesa (da qui la riga del mio codice commentata sleep(1)
) e non ha aiutato.
Sto chiamando questa funzionalità di visualizzazione dalla mia applicazione console e quando l'immagine si blocca, il controllo ritorna alla mia applicazione e posso continuare ad usarlo (ma la finestra dell'immagine è ancora congelata sullo sfondo).
Potete darmi qualche suggerimento su come risolvere questo problema?
EDIT
Ho parlato con alcune persone che si occupano di computer vision e OpenCV su base regolare dal porre la domanda, ed ancora senza idee.
Ho anche trovato un simile stackoverflow question, ma non esiste ancora una risposta accettata. Googleing dà solo domande simili come risultato, ma nessuna risposta.
Tutte le idee su cosa provare (anche se non sono la soluzione completa) sono molto apprezzate.
cosa ci puoi dire sull'array di immagini? puoi pubblicare il suo codice di creazione e assegnazione? BTW hai taggato questo come C++ quindi perché stai usando il vecchio stile C di opencv? – Boaz
Lo stile C di OpenCv è dovuto alla necessità di utilizzare una libreria C che utilizza OpenCV con il mio codice e alcuni dati sono in strutture di dati OpenCV in stile C. Questo in realtà è uno snippet di codice molto più grande, e accedo molto diversamente ai nomi delle mie immagini. Per il gusto della domanda, l'array di immagini contiene percorsi di file per l'immagine nel membro .name (aggiornerò la domanda) – penelope
Hai provato 'cvDestroyAllWindows()'? Se è così, e non funziona, c'è uno strano bug nel tuo codice da qualche parte (forse non nel precedente) o in OpenCv. Se funziona, c'è un piccolo bug da qualche parte. – Florian