Target Tracking: Unterschied zwischen den Versionen
(→Lösung) |
|||
(20 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 15: | Zeile 15: | ||
== Lösung == | == Lösung == | ||
Die Lösung der Aufgabenstellung teilt sich in drei Teilschritte: | |||
=== Ansteuern des Raketenwerfers === | === Ansteuern des Raketenwerfers === | ||
[[ | Zur Lösung der Aufgabe ist der von getdigital.de vertriebene Raketenwerfer zur Lösung der Aufgabe nicht geeignet, da so nur eine Ansteuerung über die gegebene Software möglich ist. Für die vorliegende Lösung wurde ein Raketenwerfer mit einer neuen Ansteuerung über [[http://de.wikipedia.org/wiki/Arduino-Plattform | Arduino]] entwickelt. Zum Ansteuern es Raketenwerfers muss die Verbindung mit matlab hergestellt werden. Erst dann kann man die einzelnen Motoren des Raketenwerfers ansteuern. <br /> | ||
[[Bild: Raketenwerfer Hardware_2.JPG|300px |Umgebauter Raketenwerfer]] <br /> | |||
Bei Fragen zur Entwicklung der neuen Ansteuerung, wenden Sie sich an [[Benutzer:Jan_Kifmann| Jan Kifmann]] oder [[Benutzer:Hauke_Ludwig| Hauke Ludwig]] | |||
<br /> <br /> | |||
Zum Initialisieren der webcam wird die Image Acquisition Toolbox verwendet. Mithilfe des BlobAnalysis Befehls lassen sich Umrisse von Objekten erkennen. Der Centroid Befehl gibt dann den Mittelpunk des gefundenen Objektes an. Zu Initialisierung werden noch verschiedene Text- und Visualisierungsbefehle benutzt, welche im Skript ersichtlich sind, jedoch zur Lösung der Aufgabe nur eine Hilfestellung für den Benutzer gibt. | |||
=== Objekterkennung (roter Ballon vor weißem Hintergrund) === | === Objekterkennung (roter Ballon vor weißem Hintergrund) === | ||
Um ein rotes Objekt in einem Live Videobild aus einem weißen Hintergrund zu selektieren müssen folgende Schritte durchgeführt werden: | |||
# Im ersten Schritt muss jedes Frame aus dem rgb-Bild einzelt ausgelesen werden. <br /> [[Bild:Rak r2b1.jpg|100px |Schritt 1| ]]<br /> Quelle: http://arindambose.com/blog/?p=72 | |||
# Der zweite Schritte besteht darin sich nur den roten Teil des RGB-Bildes zu holen. <br /> [[Bild:Rak r2b5.jpg|100px |Schritt 2]]<br /> Quelle: http://arindambose.com/blog/?p=72 | |||
# Darauf in wird das Bild aus dem rgb-Farbraum in ein Graustufenbild umgewandelt. <br /> [[Bild:Rak r2b2.jpg|100px |Schritt 3]]<br /> Quelle: http://arindambose.com/blog/?p=72 | |||
# Nun wird der rote Teil des RGB-Bildes vom Graubild subtrahiert. <br /> [[Bild:Rak r2b3.jpg|100px |Schritt 4]]<br /> Quelle: http://arindambose.com/blog/?p=72 | |||
# Auf das Graubild wird ein Median Filter eingesetzt um störende Verrauschungen zu entfernen. <br /> [[Bild:Rak r2b4.jpg|100px |Schritt 5]]<br /> Quelle: http://arindambose.com/blog/?p=72 | |||
# Das gefilterte Bild wird nun in ein Binärbild umgewandelt. Die roten Objekte werden hierfür weiß gemacht der Rest wird schwarz. <br /> [[Bild:Rak r2b6.jpg|100px |Schritt 6]]<br /> Quelle: http://arindambose.com/blog/?p=72 | |||
<br /> | |||
Diese Schritte werden im Code während der While-schleife immer wieder für jedes Bild durchgeführt. Anhand dessen kann nun mit Hilfe des BlobAnalysis-Befehls nun die roten Objekte selktiert werden. | |||
=== Objekt Tracking === | |||
Um das Objekt zu verfolgen wird auf die zuvor im vision.BlobAnalysis-Befehl ausgebenen und in der centroid-Variable gespeicherten Mittelwertskoordinaten zugegriffen. | |||
Außerdem wird die Tatsache genutzt, dass der Raketenwerfer etwas über dem Mittelpunkt des Kamarabildes schießt. Dieser befindet sich in einem Bereich von: | |||
*X-Richtung: 330-380 | |||
*Y-Richtung: 360-290 | |||
Dadurch wird die Annahme getroffen, dass wenn das zu treffende Objekt sich in Bildmittelpunktbereich befindet, es getroffen wird. Dies wird erreicht indem anhand von if-Bedingungen und der Centroid Variable geprüft wird ob sich der Mittelpunkt des Objektes sich bereits im Abschussbereich befindet, wenn dies nicht der Fall ist soll der Raketenwerfer sich solange in diese Richtung bewegen. <br /><br /> | |||
Befinden sich nun der Mittelpunkt des Objektes oberhalb des Kameramittelpunktes, werden alle Bewegungen des Raketenwerfers eingestellt und das Objekt wird abgeschossen. | |||
== Bedienung des Tools == | |||
Zum Testen der Lösung muss eine webcam auf dem Raketenwerfer mittig befestigt werden. Raketenwerfer und webcam müssen in die USB-Anschlüsse gesteckt werden. Im matlab file target_tracking.m muss dann die Variable usb_port_rak dem aktuellen USB-Port angepasst werden (siehe Gerätemanager). Je nach Lichtverhältnis und Entfernung Raketenwerfer - Wand müssen der Schwellwert der Roterkennung und die minimale und maximale blob area angepasst werden. | |||
== Ausblick == | |||
Aufgrund der gegebenen Hardware kann der Raketenwerfer sich schnell bewegende Objekte schlecht treffen, denn der Raketenwerfer bewegt sich dafür zu langsam.Die Bewegung des Objektes ist im Video durch rütteln am Raketenwerfer simuliert worden. <br /> Man könnte mithilfe einer Vorrausberechnung der Flugbahn dem entgegenwirken. Dies benötigt jedoch einen leistungsfähigen Computer. Ob der Arduinu dafür geeignet ist, bleibt zweifelhaft. Des Weiteren könnte man maximal den Bereich des Mittelpunktes eingrenzen und die Parameter genauer setzen. Der Rotbereich muss für jede Gegebenheit, sprich Lichtverhältnis, angepasst werden, dies könnte in einem weiteren Schritt noch verändert werden. Das Skript zur Roterkennung sieht teilweise auch andere rote Objekte als nur den Ballon, da die Range für die Objekte noch sehr grob ist. Man müsste eine feste Größe für die Ballons definieren, um nur bestimmte Objekte wie Ballons selektieren zu können. | |||
<!-- | |||
== Video == | |||
Das Video des Funktionsnachweises findet sich auf [http://www.youtube.com/watch?v=paGen5t4v_U&feature=share&list=PLoyKJifb3ROe_sKfT3y3paswSyiQ8xqm1&index=2 YouTube]. | |||
--> | |||
== Siehe auch == | |||
Vollständige Lösung mit Video[http://193.175.248.52/usvn/svn/DSB/trunk/User/SoSe2014/Berysztak/Target_Tracking/] <br /> | |||
Quelle zur Roterkennung[http://arindambose.com/blog/?p=72] | |||
<!-- | <!-- | ||
== Weblinks == | == Weblinks == | ||
--> | --> |
Aktuelle Version vom 16. Dezember 2014, 09:52 Uhr
Autor: Martin Berysztak
Betreuer: Prof. Schneider
Ziel
Ein roter Luftballon soll in Bewegung vor einem weissen Hintergrund erkannt und vom Raketenwerfer getroffen werden.
Aufgabe
- Erkennen Sie den Luftballon vor seinem Hintergrund mit einer Webcam.
- Fokussieren Sie den Raketenwerfer auf den Luftballonschwerpunkt.
- Treffen Sie den Luftballon in einer Flugsequenz mit 3 von 4 Schüssen.
Lösung
Die Lösung der Aufgabenstellung teilt sich in drei Teilschritte:
Ansteuern des Raketenwerfers
Zur Lösung der Aufgabe ist der von getdigital.de vertriebene Raketenwerfer zur Lösung der Aufgabe nicht geeignet, da so nur eine Ansteuerung über die gegebene Software möglich ist. Für die vorliegende Lösung wurde ein Raketenwerfer mit einer neuen Ansteuerung über [| Arduino] entwickelt. Zum Ansteuern es Raketenwerfers muss die Verbindung mit matlab hergestellt werden. Erst dann kann man die einzelnen Motoren des Raketenwerfers ansteuern.
Bei Fragen zur Entwicklung der neuen Ansteuerung, wenden Sie sich an Jan Kifmann oder Hauke Ludwig
Zum Initialisieren der webcam wird die Image Acquisition Toolbox verwendet. Mithilfe des BlobAnalysis Befehls lassen sich Umrisse von Objekten erkennen. Der Centroid Befehl gibt dann den Mittelpunk des gefundenen Objektes an. Zu Initialisierung werden noch verschiedene Text- und Visualisierungsbefehle benutzt, welche im Skript ersichtlich sind, jedoch zur Lösung der Aufgabe nur eine Hilfestellung für den Benutzer gibt.
Objekterkennung (roter Ballon vor weißem Hintergrund)
Um ein rotes Objekt in einem Live Videobild aus einem weißen Hintergrund zu selektieren müssen folgende Schritte durchgeführt werden:
- Im ersten Schritt muss jedes Frame aus dem rgb-Bild einzelt ausgelesen werden.
Quelle: http://arindambose.com/blog/?p=72 - Der zweite Schritte besteht darin sich nur den roten Teil des RGB-Bildes zu holen.
Quelle: http://arindambose.com/blog/?p=72 - Darauf in wird das Bild aus dem rgb-Farbraum in ein Graustufenbild umgewandelt.
Quelle: http://arindambose.com/blog/?p=72 - Nun wird der rote Teil des RGB-Bildes vom Graubild subtrahiert.
Quelle: http://arindambose.com/blog/?p=72 - Auf das Graubild wird ein Median Filter eingesetzt um störende Verrauschungen zu entfernen.
Quelle: http://arindambose.com/blog/?p=72 - Das gefilterte Bild wird nun in ein Binärbild umgewandelt. Die roten Objekte werden hierfür weiß gemacht der Rest wird schwarz.
Quelle: http://arindambose.com/blog/?p=72
Diese Schritte werden im Code während der While-schleife immer wieder für jedes Bild durchgeführt. Anhand dessen kann nun mit Hilfe des BlobAnalysis-Befehls nun die roten Objekte selktiert werden.
Objekt Tracking
Um das Objekt zu verfolgen wird auf die zuvor im vision.BlobAnalysis-Befehl ausgebenen und in der centroid-Variable gespeicherten Mittelwertskoordinaten zugegriffen. Außerdem wird die Tatsache genutzt, dass der Raketenwerfer etwas über dem Mittelpunkt des Kamarabildes schießt. Dieser befindet sich in einem Bereich von:
- X-Richtung: 330-380
- Y-Richtung: 360-290
Dadurch wird die Annahme getroffen, dass wenn das zu treffende Objekt sich in Bildmittelpunktbereich befindet, es getroffen wird. Dies wird erreicht indem anhand von if-Bedingungen und der Centroid Variable geprüft wird ob sich der Mittelpunkt des Objektes sich bereits im Abschussbereich befindet, wenn dies nicht der Fall ist soll der Raketenwerfer sich solange in diese Richtung bewegen.
Befinden sich nun der Mittelpunkt des Objektes oberhalb des Kameramittelpunktes, werden alle Bewegungen des Raketenwerfers eingestellt und das Objekt wird abgeschossen.
Bedienung des Tools
Zum Testen der Lösung muss eine webcam auf dem Raketenwerfer mittig befestigt werden. Raketenwerfer und webcam müssen in die USB-Anschlüsse gesteckt werden. Im matlab file target_tracking.m muss dann die Variable usb_port_rak dem aktuellen USB-Port angepasst werden (siehe Gerätemanager). Je nach Lichtverhältnis und Entfernung Raketenwerfer - Wand müssen der Schwellwert der Roterkennung und die minimale und maximale blob area angepasst werden.
Ausblick
Aufgrund der gegebenen Hardware kann der Raketenwerfer sich schnell bewegende Objekte schlecht treffen, denn der Raketenwerfer bewegt sich dafür zu langsam.Die Bewegung des Objektes ist im Video durch rütteln am Raketenwerfer simuliert worden.
Man könnte mithilfe einer Vorrausberechnung der Flugbahn dem entgegenwirken. Dies benötigt jedoch einen leistungsfähigen Computer. Ob der Arduinu dafür geeignet ist, bleibt zweifelhaft. Des Weiteren könnte man maximal den Bereich des Mittelpunktes eingrenzen und die Parameter genauer setzen. Der Rotbereich muss für jede Gegebenheit, sprich Lichtverhältnis, angepasst werden, dies könnte in einem weiteren Schritt noch verändert werden. Das Skript zur Roterkennung sieht teilweise auch andere rote Objekte als nur den Ballon, da die Range für die Objekte noch sehr grob ist. Man müsste eine feste Größe für die Ballons definieren, um nur bestimmte Objekte wie Ballons selektieren zu können.
Siehe auch
Vollständige Lösung mit Video[1]
Quelle zur Roterkennung[2]
→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2014