Wie kann Bewegung zwischen zwei PIL-Bildern erkannt werden? (WxPython Webcam-Integrationsbeispiel enthalten)

8

Hat jemand irgendwelche Vorschläge, wie ich Bildvergleiche in Python machen könnte, um Änderungen in einem Bild zu erkennen? Ich arbeite gerade an einer App, die meinen Bereich mit meiner Webcam überwacht. Ich würde gerne herausfinden, wie man die Bilder in jedem Frame vergleicht, um festzustellen, ob eine Bewegung erkannt wurde. Auf lange Sicht würde ich gerne einen Empfindlichkeitsregler einrichten. Wenn Sie also in der Lage sind, mich in die Richtung zu führen, bin ich mir sicher, dass ich den Rest herausfinden kann.

Da ich hier ein paar Posts über die Integration einer Webcam mit wxPython gesehen habe, hier eine kleine Demo. Bitte beachten Sie, dass ich gerade gestern Abend damit begonnen habe. Wenn Sie also nach einem Tipp-Top-Code suchen, müssen Sie ihn vielleicht selbst überarbeiten (vorerst;):

Anforderungen: PIL & amp; VideoCapture

%Vor%

* UPDATE *

Mit Pauls Beispiel habe ich eine Klasse erstellt und in meinen Code implementiert:

%Vor%

und fügte dann die Variable self.image = False der Funktion __init__() von VideoCaptureThread hinzu und fügte den folgenden Code zu VideoCaptureThreads run () Funktion nach der Zeile im = Bild.fromstring (...) :

%Vor%

Wenn ich das Beispiel starte, scheint es in Ordnung zu sein, aber ich bin ein bisschen verwirrt mit den Ergebnissen, die ich bekomme:

%Vor%

Bisher scheint es so, als ob jedes zweite Bild ziemlich weit weg ist, obwohl die Änderungen minimal sind. The addition to run sollte theoretisch das vorherige Bild unter der Variable self.image erfassen und mit dem neuen Bild vergleichen im . Nach dem Vergleich wird self.image mit self.image = im auf das aktuelle Bild aktualisiert, also warum Würde es in jedem zweiten Bild einen solchen Unterschied geben? Meine Augen könnten sich höchstens in den beiden Bildern hin- und herbewegen, und ich kann nicht sehen, dass das mit meinen Ergebnissen einen Unterschied macht.

* AKTUALISIEREN 2 *

Hier ist, was ich bisher habe, gibt es drei Vergleichsklassen mit drei verschiedenen Methoden, um Bewegung zu erkennen.

class Images ~ Der erste Versuch, Code zu verwenden, den ich beim googlen gefunden habe, kann sich nicht einmal daran erinnern, wie er funktioniert. : P

Klasse Images2 ~ Erstellt mit Pauls Code aus diesem Thread, der seine aktualisierte Entropie-Funktion implementiert.

Klasse Images3 ~ Geänderte Version der DetectMotion-Funktion gefunden hier . (Prozentsatz der Rückgabe wurde geändert und scheint die Beleuchtung zu berücksichtigen)

Ehrlich gesagt habe ich wirklich keine Ahnung, was einer von ihnen tut, aber was ich sagen kann ist, dass Class3 bisher die einfachste / genaueste Methode ist, die Erkennung einzurichten, der Untergang dauert mehr Zeit Prozess als die anderen beiden Klassen.

(Bitte beachten Sie, dass einige Import-Änderungen vorgenommen wurden, um Kollisionen mit scipy zu vermeiden, sys.modules ["Image"] ist dasselbe wie PIL.Image)

%Vor%     
AWainb 02.04.2011, 15:53
quelle

1 Antwort

9

Dies mag eine naive Herangehensweise sein, aber es ist ein einfacher Anfang. Ich bin mir sicher, dass Sie von Kamerarauschen beeinflusst werden und dass Sie Änderungen in der Beleuchtung von Änderungen in der Bildkomposition unterscheiden möchten. Aber hier kam mir in den Sinn:

Sie können PIL ImageChops verwenden, um effizient zwischen Bildern zu unterscheiden. Dann können Sie die Entropie dieses diff, um eine einwertige Schwelle zu erhalten.

Es scheint zu funktionieren:

%Vor%

Dies ist meiner Meinung nach ein viel besserer Algorithmus für die Bildentropie, da er dreidimensional im Farbraum ablegt, anstatt für jede Bande ein separates Histogramm zu erstellen.

BEARBEITEN - diese Funktion wurde am 6. April 2012 geändert

%Vor%

Das sind meine Testbilder:

Bild 1

Bild 2

Bild 3

    
Paul 02.04.2011, 17:20
quelle