Morgen, da ich langsam auf dem Schlauch stehe möchte ich mein Problem hier mal schildern: - Ich habe ein beliebiges Objekt welches sich horinzontal im Bild bewegt. - Der Bereich der horizontalen Bewegung ist unveränderlich. - Das Objekt hat keine eindetigen Merkmale und kann teilweise verdeckt werden. - Die Position des Objekts soll pixelgenau, wenn möglich subpixelgenau, ermittelt werden. - Das ganze soll schnell sein. (50 bis 100FPS). - (eierlegende Wollmilchsau) Ich verwende eine handelsübliche Industriekamera mit Gigabit-Ethernet und einen nomalen PC mit OpenCV und FFTW als Library. Bisher kann ich "triviale" Dinge wie: - Automatische horizontale ROI (Region of iterest) erkennen und in der Kamera setzen. - Dynamisch eine ROI um das Objekt finden (also ein Auschnitt aus der Kamera-ROI) - Automatisch das Objekt erkennen und als Template ablegen. - Automatisch den Hintergrund extrahieren. (D.h. das was man sehen würde wenn das Objekt nicht da wäre). Dein Hintergrund verwende ich für eine Vordergrund-Hintergrund-Vergleich u.a. für die Dynamische ROI um das Objekt Verschiedene Ansätze habe ich getestet: - "triviales" Template Matching funktioniert gut bei rechtwinklichen Templates (keinen Hinterundanteil). Funktioniert nicht sicher bei teilweiser Verdeckung des Objektes. Geschwindigkeit mit OpenCV "geht so". - Vordergrund-Hintergrundvergleich: An sich ist die Objekt-ROI schon recht genau die Objekt-Position des Objekts. Aber aufgrund von Schattenwurd ist der Vordergrund-Hintergrund-Vergleuch an manchen stellen auf enige Px ungenau. Außerdem kann die Objekt-ROI wegen anderen bewegten Objekten fälschlich größer bestimmt werden als nötig. - partielles Template Matching (Template wird in sub-Templates unterteilt). Idee: nicht jedes Sub-Template muss gefunden werden. So können Teile verdeckt sein. Problem: zu langsam und je kleiner das Template wird desto ungenauer das Ergebnis. Bei nicht rechtwinkligen Templates sind die Ergenisse schlecht bis unbrauchbar. - optischer Fluss: Ich kann eine Bewegung prinzipiell ermitteln. Ich erhalte aber keine absoluten Pixel sondern eine willkürliche Größenordnung (Variiert z.b. je nach Anzahl der Flusspunkte trotz Mittelwertbildung über bewegte Pixel). Außerdem habe ich einen Drift (ich komme nicht wieder im Startpunkt an). Und ich weiß nicht wie ich Verdeckung durch bewegte Objekte ausblenden kann. - "Phasen-Korrelation" (richtiges Wort)? Code und Idee habe ich hier geklaut: http://nashruddin.com/phase-correlation-function-in-opencv.html Die Relativbewegung zweier gleichgroßer Bilder wird ermittelt. Das funktioniert gut mit normalen Bildern, schlecht aber in meinem Fall wo sich noch Hintergrundausschnitte im Bild befinden. Ich bin etwas am Ende meiner Weisheit. Wobei sich Weisheit all das nennen kann was ich im Verlauf der beschiebenen Dinge gelernt habe denn BV-Erfahrung habe ich sonst keine. Was gibt es noch für Ideen/Ansätze Ich wäre für jeden Schubser in eine sinnvolle Richtung dankbar. Gruß Christoph
> - Die Position des Objekts soll pixelgenau, wenn möglich subpixelgenau, > ermittelt werden. Die Auflösung des Meßsystems muß mindestens doppelt so hoch sein wie das zu messende Objekt bzw. Signal. Eine einfache Überlegung dazu : wenn ich ein Objekt das so groß wie ein Pixel ist zwischen zwei Pixeln auf der CCD abbilde sind beide halb aktiv. Bei Binarisieren kann ich nun den Schwellwert so setzen daß entweder für die Größe des Objekts zwei Pixel erkannt werden oder gar keins.
Es gibt eine Reihe von papers zu dem Thema, sieh mal in richtung "object recognition". Wikipedia hat auf einige links. hier macht einer Flugzeugverfolgung. Das dürfte auch darauf hinauslaufen, partielle Abdeckkungen zu ignorieren. http://de.wikipedia.org/wiki/Bildverarbeitung
Je nach Variation des Objektes brauchst du verschiedene feldweise operierende Korrelatoreinheiten mit verschiedenen Ansätzen. Das Ganze geht je nach Parameterzahl recht schnell in die Potenzen an Rechenoperationen. Wenn Du aber Objektbewegung extrahierst und geschätzt hast, kann man es drastisch reduzieren. Christoph abc schrieb: > Das ganze soll schnell sein. (50 bis 100FPS). Habe sowas im FPGA gemacht für den 5D-Fall. Macht 5hoch5 -> 3000 Fälle, von denen dann aber nur 3 hoch 5 = 243 Fälle gerechnet werden müssen. Bei 200 fps waren das fast 50kHz frame rate, allerdings bei kleinen Bildern (320 x 240). Trotzdem waren 24 Recheneinheiten parallel aktiv. Christoph abc schrieb: > "triviales" Template Matching funktioniert gut bei rechtwinklichen > Templates (keinen Hinterundanteil). Davon wirst Du nicht ausgehen können, schon weil sich das Bild drehen kann (Kamerabewegung)
Uwe schrieb: > Die Auflösung des Meßsystems muß mindestens doppelt so hoch sein wie das > zu messende Objekt bzw. Signal. > Eine einfache Überlegung dazu : wenn ich ein Objekt das so groß wie ein > Pixel ist zwischen zwei Pixeln auf der CCD abbilde sind beide halb > aktiv. > Bei Binarisieren kann ich nun den Schwellwert so setzen daß entweder für > die Größe des Objekts zwei Pixel erkannt werden oder gar keins. Danke. Habe ich noch nicht drüber nachgedacht, aber macht Sinn. Die Vorgabe kann ich erfüllen. Primär steht aber eh erstmal pixelgenau im Vordergrund. Bildverarbeiter de Luxe schrieb: > hier macht einer Flugzeugverfolgung. Das dürfte auch darauf > hinauslaufen, partielle Abdeckkungen zu ignorieren. Danke. Den Wiki-Atikel kenne ich schon, aber zu der Flugzeugverfolgung finde ich nicht mehr als das Bild. J. S. schrieb: > Je nach Variation des Objektes brauchst du verschiedene feldweise > operierende Korrelatoreinheiten mit verschiedenen Ansätzen. Das Ganze > geht je nach Parameterzahl recht schnell in die Potenzen an > Rechenoperationen. Wenn Du aber Objektbewegung extrahierst und geschätzt > hast, kann man es drastisch reduzieren. Ja der Rechenaufwand ist mein Problem. Und keine Erfahung in der Implementierung von BV-Algorithmen. Die OpenCV Funktionen zur Korrelation (bzw Template Matching) sind recht gut und schnell, nur leider führen Hintergrundanteile im Bild zu falschen Ergebnissen. Der Versuch es selber zu Implementieren und eine bekannt Maske auszunutzen (ich weiß welcher Teil des Templates zum Objekt gehört und welcher zum Hintergrund) ging leider schief bzw ich bin mir noch nicht sicher wie ich das richtig im Frequenzbereich mache. > Christoph abc schrieb: >> Das ganze soll schnell sein. (50 bis 100FPS). > Habe sowas im FPGA gemacht für den 5D-Fall. Macht 5hoch5 -> 3000 Fälle, > von denen dann aber nur 3 hoch 5 = 243 Fälle gerechnet werden müssen. > Bei 200 fps waren das fast 50kHz frame rate, allerdings bei kleinen > Bildern (320 x 240). Trotzdem waren 24 Recheneinheiten parallel aktiv. Gut, ich habe einen normalen PC ;-). Es ist aber nicht so schlimm wenn ich die Vorgabe nicht einhalten kann solange der Rest funktioniert. > Christoph abc schrieb: >> "triviales" Template Matching funktioniert gut bei rechtwinklichen >> Templates (keinen Hinterundanteil). > Davon wirst Du nicht ausgehen können, schon weil sich das Bild drehen > kann (Kamerabewegung) Guter Punkt, aber vorerst kann ich den ignorieren. Die Kamera ist fest montiert und das Objekt rotiert nicht. Nur die optische Verzerrung verfälscht das Bild eigentlich, lasse ich aber erst mal außen vor.
Uwe schrieb: > Die Auflösung des Meßsystems muß mindestens doppelt so hoch sein wie das > zu messende Objekt bzw. Signal. Nein, das stimmt nicht. Ein Student hier an der Uni hat z.B. ein akkustisches Radar gebaut, mit dem Objekte auf 5 cm genau lokalisiert werden können, selbst wenn das Echo nur z.B. 500 Hz gesampelt wird. (In dieser Zeit bewegt sich der Schall 60 Zentimeter, und trotzdem ist die Auflösung 5 Zentimeter.) Die von dir genannte Nyquistbedingung (Samplerate doppelt so hoch wie die Bandbreite) kann in vielen praktischen Anwendung grob gesagt "verletzt" werden. Das liegt daran, dass für die meisten Probleme die augenscheinliche Bandbreite (z.B. Signalfrequenz) nicht der für das Problem relevanten Bandbreite (z.B. Rate an tatsächlich übermittelter Information) entspricht.
Ich scheitere gerade am Versuch eine Korrelation selber zu scheiben (im Frequenzbereich mit FFT und multiplikation) Ich habe ein kleines Template und ein größeres Bild in dem ich das Template finden will. Was muss ich jetzt machen? Ist nicht meine mathematische Stärke und die Angaben im Web variiern. 1. ich betrachte beie bilder als ein 1-dimensionales Signal (Signal a und Signal b) 2. Bei Signal a und Signal b den Mittelwert abziehen. 3. das kürzere Sigbal auf Länge des längeren Bringen (Zero-Padding) 4. FFT beider Signale Bilden 5. Elementweise komplexe Multiplikation von Sigal a mit b* (* = komplex konjugiuert) 6. invertse FFT 7. Realteil der inversen FFT entsprich meinem Korrelationsergebnis 7. Maxima in Korrelationsergebnis suchen Stimmt das so? gruß Christoph
radar schrieb: > Nein, das stimmt nicht. Ein Student hier an der Uni hat z.B. ein > akkustisches Radar gebaut, mit dem Objekte auf 5 cm genau lokalisiert > werden können, selbst wenn das Echo nur z.B. 500 Hz gesampelt wird. Was die Schallgeschwindigkeit mit der Abtastung zu tun? Du samplest ja die Amplitude und nicht die Gruppenlaufzeit.
Michael schrieb: > radar schrieb: >> Nein, das stimmt nicht. Ein Student hier an der Uni hat z.B. ein >> akkustisches Radar gebaut, mit dem Objekte auf 5 cm genau lokalisiert >> werden können, selbst wenn das Echo nur z.B. 500 Hz gesampelt wird. > Was die Schallgeschwindigkeit mit der Abtastung zu tun? Du samplest ja > die Amplitude und nicht die Gruppenlaufzeit. Die Distanz des Objekts ergibt sich aus der Laufzeit. Diese Laufzeit muss also genau bestimmt werden. Beim einfachsten Radar-Setup sendet man einen Impuls und misst die Zeit, bis er zurückkommt. Je häufiger man misst, desto genauer kann man die exakte Ankunftszeit bestimmen. Die Auflösung entspricht dann genau der Zeit zwischen zwei Samples multipliziert mit der Schallgeschwindigkeit.
Na und ! Man kann ein Objekt auch mit 0,05mm lokalisieren wenn man nur mit 0.00000001Hz oder was auch immer Sampled. Dein Beispiel ist schlicht und ergreifend nicht durchdacht.
Damit dein Beispiel zu der Sitution passt solltest du die Geschwindigkeit des Objektes bestimmen.
Ihr redet ein wenig aneinander vorbei. Richtig ist, dass man die Objektverschiebungen sehr wohl deutlich unterhalb der Pixelgrösse messen kann und zwar theoretisch beliebig genau.. Die Position des Objektes bildet sich in analoger Betrachtung als Phase ab und die ist zunächst unabhängig von der Auflösung. Beim Samplen mit 44kHz Audio wird auch immer wieder verkündet, man könne damit keine zeitlichen Änderungen von unter 1/44k s abbilden. Tatsächlich lässt sich abgesehen von Jitter und der Amplitudenauflösung jede minimale Phasenverschiebung generieren und im umgekehrten Betrachtungsfall auch messen. Praktisch ist es in der BV natürlich so, dass die Pixel einem Rauschen unterworfen sind, unterschiedliche gain-offsets haben, optische Abbildungsfehler und Beleuchtungsungenauigkeien dazu führen, dass die Information schwammig wird. Je mehr Pixel dann zur Betrachtung herangezogen werden, desto genauer wird die Berechung. Man benötigt also eine wachsende Zahl an Samples, um Bewegungsvergleiche machen zu können. Jetzt gibt es zwei Punkte: Die Samplezahl, die man zur Verfügung hat, um Vergleiche zu vollziehen, ist aber limitiert, denn: 1.) "Mehr Samples durch mehr Fläche" liefert irgendwann keine weitere Information mehr, weil das Objekt eine endliche Ausdehnung besitzt. 2.) "Mehr Samples durch mehr Auflösung" bringt irgendwann keine Verbessung mehr und ist überdies nicht linear in der Verbesserung. Wesentlich bei der BV ist vor allem die Optik, deren Abbildung und die Ruhe der Kamera, wobei man beides (optische Unschärfe und Bewegung) auch dazu nutzen kann, die Auflösung zu erhöhen. Statt ein besonders scharfes Bild auf den Sensor zu werfen, kann es sinnvoll sein, eine Unschärfe zu nutzen oder reinzurechnen, um dann einen tieffrequenten Phasenvergleich zu vollziehen.
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.