Cercare di chiudere la finestra OpenCV non ha alcun effetto

Sto catturando l’immagine della webcam con OpenCV. Funziona bene Ma se voglio chiudere OpenCV quando viene premuto un pulsante, non funziona (ho provato sia cvDestroyWindow("NameOfWindow") che cvDestroyAllWindows() ). La finestra rimane aperta e l’applicazione è ancora in esecuzione.

OpenCV è stato inizializzato su un thread separato dalla GUI principale.

Sto usando Juce Framework con C ++ sul mio Mac. Ma lo stesso problema si verifica anche su Windows con Qt e Windows Form, quando la finestra di OpenCV ha il proprio cvNamedWindow.

Ecco il codice di base della class dell’editor di plug-in VST:

PluginEditor.cpp

 #include  #include  #include "PluginProcessor.h" #include "PluginEditor.h" // TestAudioProcessorEditor::TestAudioProcessorEditor (TestAudioProcessor* ownerFilter) : AudioProcessorEditor (ownerFilter) { // This is where our plugin's editor size is set. setSize (500, 500); // open the tracker openTracker(); } // code for opencv handling TestAudioProcessorEditor::openTracker() { // KEY LINE: Start the window thread cvStartWindowThread(); // Create a window in which the captured images will be presented cvNamedWindow( "Webcam", CV_WINDOW_AUTOSIZE ); cvWaitKey(0); cvDestroyWindow( "Webcam" ); // window should disappear! } TestAudioProcessorEditor::~TestAudioProcessorEditor() { } // paint stuff on the vst plugin surface void TestAudioProcessorEditor::paint (Graphics& g) { } 

Il pezzo che potresti mancare è una chiamata alla funzione cvStartWindowThread .

Su Linux, utilizzando GTK HighGUI, questo esempio ha riprodotto il tuo problema, fino a quando ho messo la chiamata a cvStartWindowThread .

 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc_c.h" #include  using namespace std; int main( int argc, char** argv ) { // KEY LINE: Start the window thread cvStartWindowThread(); // Open a window cvNamedWindow("original", 0); // Wait until a key gets pressed inside the window cvWaitKey(0); // Close the window cvDestroyWindow("original"); // Verify that the window is closed cout<<"The window should be closed now. (Press ENTER to continue.)"< 

Se cvStartWindowThread non aiuta, prova a fare una chiamata extra a cvWaitKey dopo la chiamata cvDestroy .

Per eseguire l'esempio, compilarlo con GCC:

 g++ destroy_window.cpp -o destroy_window -lopencv_core -lopencv_highgui