Programm beendet sich nicht und weiteres seltsames Verhalten

benjamin222

Mitglied
Java:
 private static void OpenCVStart() {
        nu.pattern.OpenCV.loadLocally();
        Mat m = Mat.eye(3,3, CvType.CV_8UC1);
        System.out.println("OpenCV matrix = " + m.dump());

        Mat f= Imgcodecs.imread("D:\\Bilder\\bikinigross.jpg");
        HighGui.imshow("bild",f);
        HighGui.waitKey(500);

        Mat g= Imgcodecs.imread("D:\\Bilder\\wwm2.png");
        HighGui.imshow("wwm",g);
        HighGui.waitKey(500);

        VideoCapture camera=new VideoCapture("D:\\Bilder\\elvira2.mp4");




        Mat frame=new Mat();

        while (true) {
            System.out.println("Looping.. \n");
            if (camera.read(frame)) {
                System.out.println("Frame Obtained");
                System.out.println("Captured Frame Width " +
                        frame.width() + " Height " + frame.height());
                HighGui.imshow("camera.jpg", frame);
                HighGui.waitKey(5);
            }else{
                break;
            }
        }

        System.out.println(" end reached");
        camera.release();
        HighGui.destroyAllWindows();


    }

Ich möchte hier zwei Bilder anzeigen und ein Video. Das klappt soweit auch, aber es gibt Probleme:

1. Ich hätte erwartet, dass jedes Bild und das Video in einem eigenen Popup auftauchen, das ist aber nicht so. Die sind alle im gleichen Fenster nacheinander.
2. Am Ende bleibt das letzte Bild des Videos sichtbar d.h. das Fenster bleibt offen und so auch das Programm. Selbst nach manuellem Schließen des Fensters läuft das Programm weiter und ich muss es hart in der IDE beenden.
 
K

kneitzel

Gast
Zu 1.: vermutlich willst Du auch HighGui.newWindow aufrufen. Zumindest klingt das sehr nach dem, was Du willst.
Zu 2.: Vermutlich wurde bei den Fenstern kein setDefaultCloseOperation gesetzt. Dann kann man mit System.exit(0) das Programm beenden oder eben die Default Close Operation setzen. (Default ist das hide on close, d.h. das Fenster existiert weiter und daher läuft das Programm auch noch weiter.)
 

benjamin222

Mitglied
1. Die Methode "HighGui.newWindow" gibt es gar nicht. Aber ja, ich hätte gerne, dass ich entscheiden kann ob ein weiteres Fenster aufgeht oder das alte überschrieben wird. Da die HighGui Klasse aus einer externen Library ist möchte ich da natürlich nichts ändern.

Ich kopiere die Klasse mal rein:

Java:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.opencv.highgui;

import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.opencv.core.Mat;

public final class HighGui {
    public static final int WINDOW_NORMAL = 0;
    public static final int WINDOW_AUTOSIZE = 1;
    public static int n_closed_windows = 0;
    public static int pressedKey = -1;
    public static CountDownLatch latch = new CountDownLatch(1);
    public static Map<String, ImageWindow> windows = new HashMap();

    public HighGui() {
    }

    public static void namedWindow(String winname) {
        namedWindow(winname, 1);
    }

    public static void namedWindow(String winname, int flag) {
        ImageWindow newWin = new ImageWindow(winname, flag);
        if (windows.get(winname) == null) {
            windows.put(winname, newWin);
        }

    }

    public static void imshow(String winname, Mat img) {
        if (img.empty()) {
            System.err.println("Error: Empty image in imshow");
            System.exit(-1);
        } else {
            ImageWindow tmpWindow = (ImageWindow)windows.get(winname);
            if (tmpWindow == null) {
                ImageWindow newWin = new ImageWindow(winname, img);
                windows.put(winname, newWin);
            } else {
                tmpWindow.setMat(img);
            }
        }

    }

    public static Image toBufferedImage(Mat m) {
        int type = 10;
        if (m.channels() > 1) {
            type = 5;
        }

        int bufferSize = m.channels() * m.cols() * m.rows();
        byte[] b = new byte[bufferSize];
        m.get(0, 0, b);
        BufferedImage image = new BufferedImage(m.cols(), m.rows(), type);
        byte[] targetPixels = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
        System.arraycopy(b, 0, targetPixels, 0, b.length);
        return image;
    }

    public static JFrame createJFrame(String title, int flag) {
        JFrame frame = new JFrame(title);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {
                ++HighGui.n_closed_windows;
                if (HighGui.n_closed_windows == HighGui.windows.size()) {
                    HighGui.latch.countDown();
                }

            }
        });
        frame.addKeyListener(new KeyListener() {
            public void keyTyped(KeyEvent e) {
            }

            public void keyReleased(KeyEvent e) {
            }

            public void keyPressed(KeyEvent e) {
                HighGui.pressedKey = e.getKeyCode();
                HighGui.latch.countDown();
            }
        });
        if (flag == 1) {
            frame.setResizable(false);
        }

        return frame;
    }

    public static void waitKey() {
        waitKey(0);
    }

    public static int waitKey(int delay) {
        latch = new CountDownLatch(1);
        n_closed_windows = 0;
        pressedKey = -1;
        if (windows.isEmpty()) {
            System.err.println("Error: waitKey must be used after an imshow");
            System.exit(-1);
        }

        Iterator iter = windows.entrySet().iterator();

        ImageWindow win;
        while(iter.hasNext()) {
            Entry<String, ImageWindow> entry = (Entry)iter.next();
            win = (ImageWindow)entry.getValue();
            if (win.alreadyUsed) {
                iter.remove();
                win.frame.dispose();
            }
        }

        Iterator var8 = windows.values().iterator();

        while(var8.hasNext()) {
            win = (ImageWindow)var8.next();
            if (win.img != null) {
                ImageIcon icon = new ImageIcon(toBufferedImage(win.img));
                if (win.lbl == null) {
                    JFrame frame = createJFrame(win.name, win.flag);
                    JLabel lbl = new JLabel(icon);
                    win.setFrameLabelVisible(frame, lbl);
                } else {
                    win.lbl.setIcon(icon);
                }
            } else {
                System.err.println("Error: no imshow associated with namedWindow: \"" + win.name + "\"");
                System.exit(-1);
            }
        }

        try {
            if (delay == 0) {
                latch.await();
            } else {
                latch.await((long)delay, TimeUnit.MILLISECONDS);
            }
        } catch (InterruptedException var7) {
            var7.printStackTrace();
        }

        for(var8 = windows.values().iterator(); var8.hasNext(); win.alreadyUsed = true) {
            win = (ImageWindow)var8.next();
        }

        return pressedKey;
    }

    public static void destroyWindow(String winname) {
        ImageWindow tmpWin = (ImageWindow)windows.get(winname);
        if (tmpWin != null) {
            windows.remove(winname);
        }

    }

    public static void destroyAllWindows() {
        windows.clear();
    }

    public static void resizeWindow(String winname, int width, int height) {
        ImageWindow tmpWin = (ImageWindow)windows.get(winname);
        if (tmpWin != null) {
            tmpWin.setNewDimension(width, height);
        }

    }

    public static void moveWindow(String winname, int x, int y) {
        ImageWindow tmpWin = (ImageWindow)windows.get(winname);
        if (tmpWin != null) {
            tmpWin.setNewPosition(x, y);
        }

    }
}

So wie ich das sehe sollte die imshow() Methode ein neues ImageWindow erstellen wenn der übergebene Name noch nicht verwendet wurde. Aber das tut es ja bei mir irgendwie nicht, sondern es wird das bestehende Window überschrieben.

2. destroyallWindows() scheint ja nur die Einträge der ImageWindows aus der Map zu löschen. Damit wäre dann immerhin klar wieso das Fenster trotzdem offen bleibt.

Zu System.exit(0): Selbst wann zeigt die IDE erst dann an, dass das Programm nicht mehr läuft wenn ich die Maus bewege und wenn ich nur die Femster schließen will aber das Programm danach noch weiter gehen soll bringt es auch nichts :/
 

Jw456

Top Contributor
Hallo du befindest dich ja in einer Endlosschleife „while(true)“

Frage wird das "If(camera.read(frame))"

überhaupt irgendwann mal false und kommst du in den else zweig wo du die Schleife beendest ?


Das VideoCapture wird doch bestimmt auch in einem Thread ausgeführt ich sehe nichts wo du Play beendest. So das der VideoThread beendet wird.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
System.exit(0): beendet das Programm. Ob da auch immer alle gestarteten Threads mit beendet werden bin ich mir nicht sicher.
 
K

kneitzel

Gast
Hmm, ich wundere mich gerade, was für ein HighGui JavaDoc ich eben vor mir hatte. Denn ich hatte da nach einer Dokumentation gesucht und bin da irgendwie drüber gestolpert.

Die Fenster sind aber da auch alle erreichbar, da public static - damit wäre ein direkter Zugiff auf alle Windows möglich.

System.exit(0): beendet das Programm. Ob da auch immer alle gestarteten Threads mit beendet werden bin ich mir nicht sicher.
Da die ganze JVM beendet wird, werden alle Threads beendet. ("Terminates the currently running Java Virtual Machine")
 

benjamin222

Mitglied
Hallo du befindest dich ja in einer Endlosschleife „while(true)“

Frage wird das "If(camera.read(frame))"

überhaupt irgendwann mal false und kommst du in den else zweig wo du die Schleife beendest ?


Das VideoCapture wird doch bestimmt auch in einem Thread ausgeführt ich sehe nichts wo du Play beendest. So das der VideoThread beendet wird.

Ja, wenn das Video zu Ende ist wird das false und die Schleife verlassen. Das wird auch durch meine debug Ausgabe

Java:
 System.out.println(" end reached");

bestätigt.
 

mihe7

Top Contributor
So wie ich das sehe sollte die imshow() Methode ein neues ImageWindow erstellen wenn der übergebene Name noch nicht verwendet wurde. Aber das tut es ja bei mir irgendwie nicht, sondern es wird das bestehende Window überschrieben.
Wenn ich es richtig sehe, funktioniert der Spaß folgendermaßen:
  1. imshow() legt ein ImageWindow-Objekt in eine Map
  2. in waitKey() wird zu jedem noch nicht "verbrauchten" ImageWindow-Objekt der Map ein JFrame erzeugt. Die bereits "verbrauchten" ImageWindow-Objekte werden aus der Map entfernt wobei die mit ihnen assoziierten JFrames abgeräumt werden.
  3. in waitKey() wird dann auf ein Ereignis (Tastendruck, Schließen des Fensters, Timeout) gewartet.
  4. Nach dem Ereignis aus 3. werden alle ImageWindow-Objekte, die sich zu diesem Zeitpunkt in der Map befinden, als "verbraucht" markiert.
waitKey() schließt somit alle Fenster, die sich beim Aufruf zuvor in der Map befanden. Um mit dieser Klasse das gewünschte Ergebnis zu erzielen, dürftest Du folglich nach einem waitKey() über die windows iterieren und bei allen Fenstern, die offen bleiben sollen, das Flag alreadyUsed auf false setzen müssen. Am Ende müsstest Du nochmal waitKey mit kurzem Timeout aufrufen, um auch das letzte Fenster zu schließen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
StupidAttack programm beendet sich Java Basics - Anfänger-Themen 6
D Programm beendet sich nicht Java Basics - Anfänger-Themen 5
X Programm wird frühzeitig beendet Java Basics - Anfänger-Themen 17
B Konsole beendet - Programm kontrolliert runter fahren Java Basics - Anfänger-Themen 2
M Java-Programm wird beendet, wenn ich Spiel öffne... Java Basics - Anfänger-Themen 11
R Wird Programm gerade beendet? Java Basics - Anfänger-Themen 10
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
M Java Mail Programm Java Basics - Anfänger-Themen 4
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
M Mini Jar-Programm Java Basics - Anfänger-Themen 51
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
M Das Programm stellt nichts dar Java Basics - Anfänger-Themen 2
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
Z Programm Ideen Java Basics - Anfänger-Themen 8
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
T Programm stürzt ab Java Basics - Anfänger-Themen 40
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
K Ist das Programm schlecht bzw. schlampig programmiert ? Java Basics - Anfänger-Themen 9
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
nbergmann IntelliJ: Wie lade ich ein fertiges Programm aus dem Lehrbuch? Java Basics - Anfänger-Themen 26
D Anfängerfrage zu meinem Programm. Java Basics - Anfänger-Themen 15
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Kydo Programm Beschreibung Java Basics - Anfänger-Themen 3
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Wo hält das Programm an? Java Basics - Anfänger-Themen 11
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
Fugover Kopfrechnen-Programm Java Basics - Anfänger-Themen 6
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
J selbst erstellte Datei mit Programm öffnen Java Basics - Anfänger-Themen 10
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
A wie kann ich es in meinem Programm rein tun Java Basics - Anfänger-Themen 8
S Fehler beim Programm Java Basics - Anfänger-Themen 2
Jose05 Fehler im Programm feststellen Java Basics - Anfänger-Themen 2
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
A Lotto Programm Java Basics - Anfänger-Themen 3
S Programm erstellen Java Basics - Anfänger-Themen 3
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
S MinMax Programm erstellen Java Basics - Anfänger-Themen 4
J Interpreter-Fehler Programm gibt nicht gewünschtes Ergebnis aus Java Basics - Anfänger-Themen 11
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
B Java Programm soll mit Python kommunizeren Java Basics - Anfänger-Themen 1
SpigBin Programm läuft nicht weiter... Java Basics - Anfänger-Themen 10
M JAVA Programm in Website einbinden Java Basics - Anfänger-Themen 19
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
WAB9703-04 Programm zum automatischen Ausfüllen von Formularen programmieren Java Basics - Anfänger-Themen 3
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
G Programm Code Java Basics - Anfänger-Themen 5
CptK Achsenskalierung in Koordinatensystem hängt Programm auf Java Basics - Anfänger-Themen 5
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
Sajeel Chattha Dieses Programm umschreiben Java Basics - Anfänger-Themen 5
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
A Programm Histogram Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
CT9288 Interaktion mit laufendem Programm -Fachbegriffe Java Basics - Anfänger-Themen 2
Gaudimagspam Assertions im Programm hinzufügen Java Basics - Anfänger-Themen 4
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
W Programm dass Palindrome erkennt Java Basics - Anfänger-Themen 6
K Erste Schritte Programm geht aus Schleife, warum? Java Basics - Anfänger-Themen 2
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben