Seite 1 von 1

spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Mittwoch 2. Februar 2022, 16:08
von gerrard87
Hallo Zusammen,

ich habe ein Programm, welches Überblendungen auf ein Livestream (Livebild) einer Kamera projiziert. Die EXE wurde mit cx_freeze erstellt.
Das Programm (Livestream) stürzt nach einigen wenigen Minuten ohne Einwirkungen ab. Da es eine EXE ist kann ich die Fehlerursache/meldung nicht finden. Gibt es eine Möglichkeit von debugging oder logging einer python EXE? Kann ich das innerhalb meines Codes machen d.h. er schreibt automatisch eine Log-Datei wenn es abstürzt mit Fehlermeldung/Ursache?

Das Programm läuft fehlerfrei auf meinem Laptop mit internal Webcam. Wenn ich es als EXE mache mit externer Webcam dann stürzt es nach einigen Minuten ab. Hier ein Code Auschnitt, welches das Thema Livestream behandelt:

Code: Alles auswählen

def cap_img(self, cap):
        ret, img = cap.read()
        img = cv2.flip(img,1)#flip cam
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).copy()
        height, width, channel = img.shape
        step = channel * width        
        # QImage::copy() 
        img = QImage(img.data, width, height, step, QImage.Format_RGB888).copy()

        if height != HEIGHT and width != WIDTH:
            img = img.scaled(WIDTH, HEIGHT)
        
        return img

    def snap_img(self, cap):
        ret, img = cap.read()
        img = cv2.flip(img,1)#flip cam
        self.snap_cv = img.copy()        

        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        height, width, channel = img.shape
        step = channel * width        
            
        self.snap = QImage(img.data, width, height, step, QImage.Format_RGB888).copy()
        if height != HEIGHT and width != WIDTH:
            self.snap = self.snap.scaled(WIDTH, HEIGHT)  

           
    # Zeige Livestream
    def livestream_overlays(self):
        super().__init__()
        
        self.overlay_base()  
        
        # Rote linien als overlays
        if self.state == 1 or self.state == 2:           
            self.overlay_red()       


        elif self.state == 3:
            self.overlay_blue()
            

        # Grüne linien als overlays (L-Taste)
        if self.lvalue:
            self.overlay_green()
  
        # Zeige Livestream mit Overlays 
        if self.spsn == True:                        
            img = self.img.scaled(int(w/2), int(h)) 
            self.img2 = self.img2.scaled(int(w/2), int(h))
            
            if self.state_cams == True:                  
                self.show_cam(self.img2,2) 
                self.show_cam(img,3) 
            else:                              
                self.show_cam(self.img2,3) 
                self.show_cam(img,2) 
                  
        else:
            img = self.img.scaled(w, h) 
            self.show_cam(img,1)    
            
 
    def insertShape(self, img1, lines, linewidth, color):        
        img = img1.copy()
        
        painter = QPainter()
        pixmap = QPixmap(img)
       
        painter.begin(img)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.drawPixmap(img.rect(), pixmap)
        painter.setPen(QPen(colors[color], linewidth))

        for line in lines:
            painter.drawLine(line[0],line[1],line[2],line[3])
        
        return img  
    
           

    def overlay_base(self):

        if self.pop != None:
            if self.pop.chns != None: 
                self.ns = self.pop.chns
                self.pop = None
        

        img = self.cap_img(self.cap).copy()            
Hoffe ihr könnt mir weiterhelfen.
Vielen Dank!

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Mittwoch 2. Februar 2022, 18:31
von sparrow
Starte die .exe in der Konsole. Dann solltest du auch eine entsprechende Fehlermeldung sehen.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Mittwoch 2. Februar 2022, 19:25
von gerrard87
sparrow hat geschrieben: Mittwoch 2. Februar 2022, 18:31 Starte die .exe in der Konsole. Dann solltest du auch eine entsprechende Fehlermeldung sehen.
Wie mache ich das denn mit der cmd / Windows Konsole? Bitte Beispiel

Danke

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Mittwoch 2. Februar 2022, 20:35
von __deets__
Den Pfad eingeben. C:\pfad\zum\programm.exe

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Mittwoch 2. Februar 2022, 21:32
von __blackjack__
@gerrard87 Und wenn auf Laptop mit interner Webcam kein Problem ist, aber als EXE und mit externer Webcam, dann wäre es naheliegend mal nicht zwei Sachen auf einmal zu ändern, sondern nur *eine* und schauen was passiert. Also EXE mit interner Webcam oder nicht als EXE aber mit externer Webcam.

Was beim Code sofort auffällt ist das `ret` nicht verwendet wird und `img` wird einfach verwendet als wenn `ret` wahr ist. Da hat ja einen Grund warum da ein Tupel zurückgegeben wird bei dem der erste Wert anzeigt ob der zweite Wert überhaupt gültig ist.

Da wird IMHO etwas inflationär mit `copy()` umgegangen. Wie sinnvoll ist es das ein `QImage` zu erstellen und das direkt mit `copy()` zu kopieren, ohne das auch nur die Chance besteht mit dem ersten `QImage` irgend was zu machen?

In einer anderen Methode als der `__init__()` die `__init__()` einer Basisklasse aufzurufen ist auch ziemlich shady. Man kann und sollte im allgemeinen nicht davon ausgehen, dass man die `__init__()`-Methode(n) mehrfach aufrufen darf. Bei `super()` weisst Du ja nicht einmal welche Methoden das alles sind.

Da sind auch mindestens zwei ”Methoden” die eigentlich Funktionen sind, wo also die Frage ist was die in der Klasse zu suchen haben. Und die Anzahl der Attribute sieht auch komisch aus. Also beispielsweise das es so etwas wie `img2` gibt. Das sieht so ein bisschen nach einer ”Klasse” aus in die ein Haufen Funktionen gepackt wurden die im Grunde über globale Variablen kommunizieren, statt sauber über Argumente und Rückgabewerte.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Donnerstag 3. Februar 2022, 08:09
von gerrard87
Also die EXE läuft mit interner und externer Webcam ohne Probleme mit meinem Laptop (stundenlang ohne Absturz). Wenn ich die EXE auf einen anderen Rechner mit externer Webcam laufen lasse stürzt diese nach einigen Minuten ab.

Ja tut mir leid ich bin da noch Anfänger und habe mir viel zusammen gekrammt im Netz.
Ich habe Copy() genutzt aus folgenden Gründen (waren TIpps von anderen Foren):
1. You are not doing the resizing with OpenCV!, do all image manipulation with OpenCV since you have the original data in it
2. QImage(img.data...) is going out of scope and you must delete when QImage gets destroyed or explicite copy the data.


Scheinbar ist meine Programmierung nicht gut aber warum funktioniert es auf dem Laptop ohne Probleme und dann auf einem anderen Rechner nicht.
Kannst du den Code optimieren?

Danke für die Hinweise nur leider kann ich die nicht in meinen Code übernehmen weil ich noch nicht ganz verstehe was zu tun ist.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Donnerstag 3. Februar 2022, 13:30
von Sirius3
Es liegt also daran, dass auf einem anderen Laptop andere Hardware oder Treiber sind.

Erster Schritt wäre immer noch, die Bugs, die __blackjack__ angesprochen hat, zu beheben, vor allem die korrekte Brücksichtigung des Rückgabewertes, und dann sich die Fehlermeldung anzuschauen, die Du bekommst.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 08:53
von gerrard87
Sirius3 hat geschrieben: Donnerstag 3. Februar 2022, 13:30 Es liegt also daran, dass auf einem anderen Laptop andere Hardware oder Treiber sind.

Erster Schritt wäre immer noch, die Bugs, die __blackjack__ angesprochen hat, zu beheben, vor allem die korrekte Brücksichtigung des Rückgabewertes, und dann sich die Fehlermeldung anzuschauen, die Du bekommst.
also ich hab es über die windows/cmd konsole gestartet, wie erwartet stürzt es nach einigen Minuten ab (das lade rad kommt und nach einer sekunde ist der livestream/programm beendet). In der Konsole steht kein Fehler, gar nix!

Jetzt frage ich mich woran es liegt und wie ich es über das Programm selbst loggen kann (daher ja meine Frage im Forum).

Danke Euch

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 09:19
von __deets__
Wenn da keine Ausgabe kommt, ist das Problem nicht in Python. Sondern in den nativen Code Anteilen, wie der opencv. Um dem auf die Schliche zu kommen, braucht’s einen debugger wie zb windbg, den man an das laufende Programm hängt, und der einem dann Hinweise gibt, warum es wo kracht. Kenntnisse in C/C++ sind da von Vorteil.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 11:54
von gerrard87
hso, also bringt es auch nix die logging im python code einzubauen?
Ist das mit windbg relativ einfach? Wie ist ungefähr der ablauf, ich starte mein Programm und windbg läuft im Hintergrund?

Ich denke es hat was mit OpenCV dann zu tun, andere Version nehmen, komplette neuinstallation machen?

Trotzdem möchte ich gerne auf das rect problem eingehen, wie muss es denn richtig gemacht werden? Könnt es anhand meines Codes (Beispiel) zeigen?

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 12:41
von __deets__
Nein, logging bringt nix. Das hilft nur bei reinen Python-Fehlern.

WinDBG ist nicht so einfach. Du musst es installieren (aus dem SDK, glaube ich. Oder extra). Und dann startet man das, und haengt es an einen bestehenden Prozess. Oder man startet darueber eine EXE, dann haengt es sich selbst dran. Und dann kracht es, und man muss die Stacktraces durchschauen.

Ob eine neue Version von OpenCV etwas taugt, kann ich nicht sagen. Ich kenne ja den Fehler nicht. Klar kann es sein, dass da was repariert wurde. Kann aber auch ein Treiberproblem sein, etc.

Fuer die rect-Sache habe ich gerade nicht die Zeit.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 14:27
von __blackjack__
Und es könnte auch sein, dass Qt irgendwo falsch verwendet wird. Da zu raten bringt nicht wirklich viel.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 15:09
von gerrard87
__blackjack__ hat geschrieben: Freitag 4. Februar 2022, 14:27 Und es könnte auch sein, dass Qt irgendwo falsch verwendet wird. Da zu raten bringt nicht wirklich viel.
mmmh so viele Fehlerquellen?! Ich weiss gar nicht wo ich anfangen soll.
Blackjack, ich habe dir mal eine PN geschickt.

Re: spontane abstürze Livestream mit Einblendung mit Python EXE

Verfasst: Freitag 4. Februar 2022, 15:11
von __deets__
Joa. Programmieren ist halt schwer. Darum wird man dafuer recht gut bezahlt, wenn man es gut genug kann, um solche Probleme zu loesen.