Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss18:tracker

Tracker

tracker.py

  • main(args)
    • Erlaubt die Ausführung des Trackers ohne GUI aus der Konsole zum Debugging
    • Verwaltet beim Debugging den gesamten Ablauf des Trackers
  • setup(videoFile, cascadeFile, initialBoxes, writeToVideo, outputFile)
    1. Öffnen des Videos unter dem übergebenen Dateipfad videoFile
    2. Lesen des ersten Frames aus dem Video; Abbruch bei Fehlschlag
    3. Auslesen der Videodetails (Framerate, Breite und Höhe eines Frames, Anzahl der Frames)
    4. Aufforderung zur Markierung des Bereichs im Bild, der den Tisch enthält
    5. Errechnung der Koordinaten zum Zuschneiden der Bilder
    6. Wenn keine initialBoxes übergeben wurde, Detektion der Pucks mithilfe der HAAR-Kaskade unter dem Dateipfad cascadeFile
    7. Filterung der Boxen von der Kaskade nach Duplikaten
    8. Verkleinerung der Boxen auf eine einheitliche Größe
    9. Initialisierung der Puck-Objekte, die das Tracking durchführen
    10. Initialisierung des multi_tracker, der die Puck-Objekte verwaltet
    11. Zurücksetzen des Frame Counters des VideoCapture-Objekts
    12. Falls über writeToVideo angefordert, Initialisierung eines VideoWriter-Objekts zur Ausgabe des Videos mit markierten Pucks in eine Video-Datei
    13. Rückgabe von Informationen an die Benutzeroberfläche zum Initialisieren der Datenverwaltung
  • run()
    1. Abfrage der Systemzeit zur Realisierung einer Stopuhr
    2. Auslesen des nächsten Frames aus dem Video; Abbruch, wenn der letzte Frame überschritten ist
    3. Zuschnitt des Frames
    4. Aufruf des multi_tracker zur Durchführung des Tracking-Prozess auf dem derzeitigen Frame
    5. Ausgabe von Zeitinformationen auf dem Frame, falls DEBUG aktiv ist
    6. Anzeige des Frames mit den markierten Pucks
    7. Falls erforderlich, Frame mit markierten Pucks in die Video-Ausgabedatei schreiben
    8. Errechnen der vergangen Zeit durch erneute Abfrage der Systemzeit
    9. Rückgabe von Status, derzeitigem Frame-Index, Positionsdaten und der für die Verarbeitung dieses Frames benötigte Zeit
  • cleanupTracker()
    1. Freigabe der Ressourcen der VideoReader- und, falls vorhanden, Video-Writer-Objekte
    2. Aufforderung des multi_tracker zur Freigabe seiner Resourcen
    3. Schließen des Tracking-Fensters
  • openAndConfigureWindow()
    • Öffnet und konfiguriert ein OpenCV-Fenster


multi_tracker.py

  • addInitialObjects(data, frame)
    1. Annahme der übergebenen Puck-Objekte in Form einer vollständigen Kopie
    2. Vollständige Kopie des derzeitigen Bilds, auf der die Markierungen angezeigt werden
    3. Initialisierung der Tracker
    4. Initialer Tracking-Versuch, um sicherzustellen, dass der Tracker den Puck verfolgen kann
    5. Anzeige der Indizes der Pucks auf dem Frame
    6. Rückgabe der Frame-Kopie und Positionsdaten an tracker.setup()
  • trackObjects(frame)
    1. Vollständige Kopie des derzeitigen Bilds, auf der die Markierungen angezeigt werden
    2. Falls aktiv, Aufruf von trackObjectsThreaded(), andernfalls sequentieller Aufruf der Tracking-Routine der Pucks und Speicherung der Daten
    3. Überprüfung der Anzahl an erfolgreich verfolgten Pucks
    4. Wiederherstellungsversuch fehlender Pucks durch Aufruf von updateBoxesWithCascade()
    5. Darstellung und Speicherung wiedergefundener Pucks
    6. Rückgabe der Frame-Kopie und Positionsdaten and tracker.run()
  • trackObjectsThreaded(frame, frameCopy, positions)
    1. Erzeugung eines Lock-Objekts zur Synchronisierung der Threads beim Zugriff auf gemeinsame Resourcen (frameCopy, positions)
    2. Initialisierung, Start und Speicherung der WorkerThreads
    3. Blockierung des Main-Threads, bis alle WorkerThreads beendet wurden
  • updateBoxesWithCascade(frame, positions, frameCopy)
    1. Suche der Pucks mithilfe der HAAR-Kaskade durch Aufruf von cascade.findPucks()
    2. Entfernung aller Boxen, die Pucks enthalten, deren Tracker noch zuverlässig arbeiten
    3. Vergößerung der Boxen, um die Chancen der Zuordnung zu der letzten bekannten Position des jeweiligen Pucks zu erhöhen
    4. Zuordnung der Boxen zu ihren Pucks und Aktualisierung der Daten des jeweiligen Pucks
    5. Rückgabe der wiedergefundenen Pucks an trackObjects()
  • notifyPuckHardFail()
    • Dekrementierung der Anzahl zuverlässig verfolgbarer Pucks
  • cleanupMultiTracker()
    • Löschen der Puck-Objekte und Zurücksetzen der Puck-Anzahl, um eine erneute Verwendung des Trackers ohne Programmneustart zu ermöglichen


worker_thread.py

  • __init__(self, puck, frame, frameCopy, posList, lock)
    • Speicherung der übergebenen Daten
  • run(self)
    1. Aufruf der Tracking-Routine des jeweiligen Pucks
    2. Aktivierung des Thread-Lock, um Kollisionen beim Zugriff auf die Liste hinter der Referenz self.posList zu verhindern
    3. Speicherung des Tracking-Ergebniss in self.posList
    4. Freigabe des Thread-Lock


puck_kcf.py

  • __init__(self, identifier, track_window)
    • Speicherung der übergebenen Daten
  • setupValues(self, frame)
    1. Erzeugung des KCF-Tracker-Objekts
    2. Initialisierung des KCF-Trackers mithilfe der Box des entsprechenden Pucks und dem übergebenen Frame
  • track(self, frame, frameCopy, threadLock = None)
    1. Aufruf des Tracking-Algorithmus
    2. Falls erfolgreich, Darstellung des Tracking-Ergebnisses, falls notwendig unter Benutzung des Thread-Lokc
    3. Bei Fehlschlag, Markierung des Pucks als nicht verfolgbar und Inkrementierung eines Frame-Zählers, wie lange der Puck nicht verfolgt werden konnte
    4. Ist der Puck mahr als 5 Frames nicht verfolgbar, wird die letzte bekannte Position als nutzlos eingestuft und die Verfolgung dieses Pucks durch Markierung als nicht nutzbar und den Aufruf von multi_tracker.notifyPuckHardFail() aufgegeben
    5. Rückgabe der in vier Eckkoordinaten umgerechneten Positionsdaten
  • checkBoxRelation(self, box)
    • Überprüft, ob sich die letzte bekannte Position dieses Pucks in der übergebenen Box befindet
  • notifyRecovered(self, newBox, frame)
    • Speicherung der neuen, mithilfe der Kaskade wiedergefundenen, Box dieses Pucks und Zurücksetzung der Fehlschlag-Markierungen und Zähler
  • drawMarkerOnFrame(self, frameCopy)
    • Darstellung der derzeitigen Position dieses Pucks auf dem übergebenen Frame
  • printIndizes(self, frameCopy)
    • Darstellung des Index dieses Pucks auf dem übergebenen Frame auf der Position dieses Pucks


cascade.py

  • findPucksInitial(cascadeFile, frame)
    1. Laden der HAAR-Kaskade aus dem übergebenen Datei cascadeFile
    2. Aufruf von findPucks() zur Lokalisierung der Pucks auf dem übergebenen Frame
  • findPucks(frame)
    1. Konvertierung des übergebenen Frames in Graustufen
    2. Lokalisierung der Pucks auf dem Graustufen-Bild mithilfe der zuvor geladenen HAAR-Kaskade
    3. Konvertierung der Daten aus der Kaskade in Tuple
    4. Rückgabe der Ergebnisse als Liste von Tuplen


utils.py

  • getCoordsFromXYWH(data)
    • Konvertierung der übergebenen Daten (Koordinaten der linken oberen Ecke und Breite und Höhe eines Rechtecks) in eine Liste mit den Koordinaten aller vier Ecken im Uhrzeigersinn, angefangen mit der oberen linken Ecke
  • doesBox1ContainBox2(box1, box2)
    • Überprüft, ob sich box2 vollständig in box1 befindet
  • doesBoxContainCoords(box, coords)
    • Überprüft, ob sich die Box coords in Koordinatenform vollständig in der Box box (obere linke Ecke und Breite und Höhe) befindet
  • checkSizeOK(box)
    • Überprüft, ob die übergebene Box mindestens so groß, wie die Boxen, die an den Tracker übergeben werden (festgelegt durch dotSize) und kleiner als die maximale Boxgröße boxSizeMax ist
  • filterDuplicates(boxes)
    • Filtert alle Boxen aus der übergebenen Liste boxes heraus, die sich vollständig in einer anderen Box in dieser Liste befinden
  • shrinkBox(box)
    • Verkleinert die übergebene Box auf eine einheitliche Größe für den Tracker (festgelegt durch dotSize)
  • enlargeBox(box, size)
    • Vergrößert die übergebene Box auf die übergebene Größe
  • millis()
    • Gibt die derzeitige Systemzeit in Millisekunden als Integer zurück
  • clockStringFromSecs(secs)
    • Konvertiert die übergebene Zeit in Sekunden in einen Zeit-String der Form HH:MM:SS




Autor: Dennis Claußner

ss18/tracker.txt · Zuletzt geändert: 2018/08/24 18:05 von dclaussner