Forum: PC-Programmierung Substraktion unter Windows (Python)


von Ben (Gast)


Lesenswert?

Hallo Leute,

Bin momentan dabei mit Python umzugehen und hab online ein Video gesehen 
in dem jemand mit dem Rasp + Cam Autos gezählt hat. Sowas wollte ich nun 
auch einmal umsetzen aber unter Python am WindowsPC.

Jetzt habe ich folgendes Problem. Erstmal zu meinem jetzigen Quellcode:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)

while(cap.isOpened()):
    ret, frame = cap.read() #read a frame

    fgmask = fgbg.apply(frame) #substractor

    img = cv2.imread("letters.jpg")

    ret,thresh1 = cv2.threshold(fgmask,127,255,cv2.THRESH_BINARY)

    kernel = np.ones((2,3),np.uint8)

    opening = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel)

    try:
        cv2.imshow('closing',closing)

    except:
        print('EOF')
        break

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()


Nun zu meinem Problem. Ich möchte, dass das erste Frame, dass mit meiner 
Cam aufgenommen wird als Referenzbild hergenommen wird. Das heißt, es 
sollen alle nachfolgenden Frames mit diesem verglichen und Änderungen 
anhand der Substraktion dargestellt werden. Nur weiß ich nicht wie ich 
das anstellen soll. Hat da jemand eine Idee?

: Verschoben durch User
von Ben (Gast)


Lesenswert?

Keiner eine Idee? :(

von Dussel (Gast)


Lesenswert?

Ich habe weder dein Problem, noch deinen Quelltext nachvollzogen, aber 
für
> Das heißt, es sollen alle nachfolgenden Frames mit diesem
> verglichen und Änderungen anhand der Substraktion dargestellt
> werden.
speichert man den ersten Frame, nimmt dann den aktuellen Frame, geht 
jeden Pixel durch und subtrahiert den einen Pixelwert vom entsprechenden 
Pixelwert des anderen Frames.

von Dirk K. (d-k)


Lesenswert?

Ben schrieb:
> Bin momentan dabei mit Python umzugehen und hab online ein Video gesehen
> in dem jemand mit dem Rasp + Cam Autos gezählt hat. Sowas wollte ich nun
> auch einmal umsetzen aber unter Python am WindowsPC.

Was willst du wirklich lernen? Python oder Bildverarbeitung? Beides 
zusammen scheint schief-zugehen. Es wäre wahrscheinlich besser sich 
erstmal auf eines davon zu fokussieren. Falls es die Bildverarbeitung 
(mit openCV und Python oder C++) ist dann gibt es hier ein paar gute 
Buchvorschläge http://opencv.org/books.html.

Den Algorithmus den du dir ausgesucht hast macht die background 
subtraction indem er sich ein Modell aus der Information der letzten 500 
Bilder baut und dann entsprechend entscheidet welche Pixel im neuen Bild 
Hintergrund und welches Vordergrund ist.

Wenn du wirklich willst was du gesagt hast (subtraction vom ersten Bild) 
dann musst du dir das selber bauen (siehe Dussels Antwort). Aber da wird 
es dann erstmal keine automatische Schattendetektion (detectShadows = 
True in deinem Code) geben und die Performance wird im Allgemeinen nicht 
besonders gut sein

: Bearbeitet durch User
von Ben (Gast)


Lesenswert?

Danke für die Antworten :)

Es ist so, dass ich mit OpenCV arbeite und es ein Projekt von der 
Hochschule ist. Es soll auch z.B. zum erkennen von Personen sein.

Stellen wir uns folgendes Szenario vor:

Ein Student kommt in einen Raum und bleibt stehen und bewegt sich kaum 
-> mein jetziger Code funktioniert zwar aber die Substraktion 
verschwindet mit der Zeit, genau diesen Zustand will ich vermeiden, denn 
die Person ist ja an sich noch da. Nur wie ich das genau anstellen soll 
ist die Frage. Das ganze Projekt soll dann auf einen Rasp oder 
dergleichen überspielt werden, wobei andere Boards mit mer Leistung 
(Odroid XU4 oder dergleichen) auch in Frage kommen.

von Jonas B. (jibi)


Lesenswert?

Du unterschätzt die Aufgabenstellung gewaltig, an guter fehlerfreier 
Personenerkennung beißen sich die Entwickler noch die Zähne aus. Im 
Labor klappt das meistens gut, nur in echt draußen geht der Spass los. 
Anders sieht es aus mit 3d Kameras.

Gruß J

von Ben (Gast)


Lesenswert?

3D Kameras? Kann man damit auch mit einem Rasp arbeiten? Oder was genau 
kann man sich da drunter vorstellen?

von Vlad T. (vlad_tepesch)


Lesenswert?

Dussel schrieb:
> speichert man den ersten Frame, nimmt dann den aktuellen Frame, geht
> jeden Pixel durch und subtrahiert den einen Pixelwert vom entsprechenden
> Pixelwert des anderen Frames.

das is doof

Bilder sind Matrizen und zum rechnen mit Matrizen benutzt man numpy. 
Damit kann man mit Matrizen rechnen, wie man es aus der Mathematik 
gewohnt ist.

Different = Minuend - Subtrahend

: Bearbeitet durch User
von Ben (Gast)


Lesenswert?

Also ich will jetzt hier kein Hightech-Produkt erstellen sondern 
lediglich von der Draufsicht erstmal Personen. Egal ob die stehen oder 
gehen, ich möchte diese erkennen und ein Quadrat oder dergleichen drum 
rum ziehen.

Allerdings verschwindet die Substraktion bei mir wenn ich mich nicht 
mehr bewege und das ist derzeit das Problem -.-

von Vlad T. (vlad_tepesch)


Lesenswert?

Ben schrieb:
> Also ich will jetzt hier kein Hightech-Produkt erstellen sondern
> lediglich von der Draufsicht erstmal Personen. Egal ob die stehen oder
> gehen, ich möchte diese erkennen und ein Quadrat oder dergleichen drum
> rum ziehen.
>
> Allerdings verschwindet die Substraktion bei mir wenn ich mich nicht
> mehr bewege und das ist derzeit das Problem -.-

Ich kenn jetzt den Backgroundsubstraktor nicht, aber kann es sein, dass 
er genau dafür da ist und das gewollt ist, dass er sich änderungen des 
Hintergrundes anpasst?
Eventuell hat der Parameter mit denen man den Grad der Anpassung 
konfigurieren kann.

Normalerweise macht es keinen Sinn ein Bild als Hintergrund zu 
definieren, es sei denn man hat ein sehr beschränkres, genau definiertes 
Umfeld - in etwa so, wie in einem Durchlichtautomaten zur 
Flashenerkennung oder so. In natürlichen Szenen ändert sich ja ständig 
was graduell (zB ein ins Bild wanderener Schatten, oder ein 
angeschaltetes Licht) - das heißt der Referenzhintergrund muss angepasst 
werden Ich vermute genau das macht die Klasse, die du verwendest.

Willst du wirklich erst mal ganz simpel anfangen, speicher dir das Bild 
als numpy-Array und subtrahiere es selbst.

von Yalu X. (yalu) (Moderator)


Lesenswert?

cv2.absdiff ist vermutlich die Funktion, die du suchst:

  http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#absdiff

von Dussel (Gast)


Lesenswert?

Vlad T. schrieb:
> Dussel schrieb:
>> speichert man den ersten Frame, nimmt dann den aktuellen Frame, geht
>> jeden Pixel durch und subtrahiert den einen Pixelwert vom entsprechenden
>> Pixelwert des anderen Frames.
>
> das is doof
>
> Bilder sind Matrizen und zum rechnen mit Matrizen benutzt man numpy.
> Damit kann man mit Matrizen rechnen, wie man es aus der Mathematik
> gewohnt ist.
Und wie macht diese Funktion die Subtraktion auf einem normalen 
Prozessor?

von GlueGoo (Gast)


Lesenswert?

>Und wie macht diese Funktion die Subtraktion auf einem normalen
Prozessor?

numbpy hat routinen die in c geproggt und compiliert sind. pyhton iss 
hier der Kleber um das ganze angenehmer im Umgang zu machen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Dussel schrieb:
> Und wie macht diese Funktion die Subtraktion auf einem normalen
> Prozessor?

was willst du damit sagen?
Dass du auch immer die Bits einzeln aus den Raw-Sektoren der Festplatte 
kratzt, weil die Dateisystemfunktionen das schließlich ja auch am ende 
intern ganz unten so machen?

von Dussel (Gast)


Lesenswert?

Vlad T. schrieb:
> Dussel schrieb:
>> Und wie macht diese Funktion die Subtraktion auf einem normalen
>> Prozessor?
>
> was willst du damit sagen?
> Dass du auch immer die Bits einzeln aus den Raw-Sektoren der Festplatte
> kratzt, weil die Dateisystemfunktionen das schließlich ja auch am ende
> intern ganz unten so machen?
Reden wir aneinander vorbei? Ich habe auf seine Aufgabenstellung 
geantwortet, wie man das machen kann. Was hat das mit mit dem 
Dateisystem zu tun?

von Dussel (Gast)


Lesenswert?

Anders gefragt, du fandest meine Lösung "doof". Was ist dein Vorschlag 
und wie unterscheidet er sich von meinem? Eine Funktion zu haben 
bedeutet nicht, dass der Prozessor die Funktion in einem Schritt 
abarbeitet.
Und wenn die offizielle Funktion das so macht, wie ich vorgeschlagen 
habe, kann mein Vorschlag wohl nicht so doof sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.