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?
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.
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
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.
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
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
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 -.-
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.
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?
>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.
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?
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?
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.