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
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
:
Bearbeitet durch User
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
3D Kameras? Kann man damit auch mit einem Rasp arbeiten? Oder was genau kann man sich da drunter vorstellen?
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
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.
cv2.absdiff ist vermutlich die Funktion, die du suchst: http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#absdiff
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.