Dieser Code verwendet OpenCV, um die Position einer Markierung in jedem vom Videogerät erfassten Bild zu erkennen. Basierend auf den physischen Abmessungen des Markers ist auch eine Schätzung möglich. Für jeden definierten Marker stehen Daten über UDP in Form von Klartext zur Verfügung. Es gibt die Übersetzung der Drehung des Objekts in Bezug auf die Kamera und die XY-Koordinaten des 2D-Schwerpunkts des Objekts zurück, die auf dem Bild der Kamera erscheinen. Wenn eine Markierung nicht sichtbar ist, sind die zurückgegebenen Zahlen eine NaN.
Bitte beachten Sie, dass dieser Code KEINE zeitlichen Informationen zur Nachverfolgung verwendet.
Stattdessen wird versucht, die Markierung zu erkennen und ihre Position in jedem erfassten Bild abzuschätzen.
.ini
-Syntax vorliegt. Sie benötigen eine Standard-Python-Umgebung mit cv2
und verfügbaren numpy
Modulen. Der Code wurde zwar mit Python 2.7 und OpenCV 3.4.1 auf einem Mac entwickelt, sollte aber auch mit Python 3 und anderen Plattformen funktionieren. Hier sind ein paar Schritte zum Erstellen einer Markierung: 1. Machen Sie ein Foto von Ihrem Objekt und schneiden Sie es zu. Idealerweise sollte die Auflösung mit Ihrer Kamera kompatibel sein. 2. Bearbeiten Sie die Konfigurationsdatei und stellen Sie sicher, dass die folgenden Zeilen festgelegt sind:
[General]
Sie können im allgemeinen Bereich so ziemlich alles beim Alten belassen, aber Sie müssen Ihre Kamera kalibrieren! Lesen Sie hier, wie Sie kalibrieren. Wenn Sie eine neue Markierung hinzufügen, müssen Sie die Einstellungen feinabstimmen. Stellen Sie daher sicher, dass das Bild der Kamera sichtbar ist.
camera_show_picture = 1
Andernfalls wird eine neue Markierung als neuer Abschnitt in der Konfigurationsdatei hinzugefügt.
Der Header ist der benutzerfreundliche Name des Markers
[My custom marker]
Geben Sie den Dateinamen und die physischen Abmessungen des Markers an:
marker_file_name = <File name in the same directory or full path>
marker_width = <Units are in mm.>
marker_height = <Units are in mm.>
Beim Einrichten einer neuen Markierung müssen Sie die folgenden Einstellungen ändern:
marker_minimum_matching_distance = <Decrease it from 50>
marker_minimum_number_of_matches = <Set this to at least 4>
pose_estimation_running_average = <more than 1>
Der marker_minimum_matching_distance
ist umgekehrt proportional zur Qualität der Merkmalsübereinstimmung zwischen dem Markierungsbild und der Kamera. Bei einer zu hohen Einstellung werden Features außerhalb der Markierung abgeglichen, bei einer zu niedrigen Einstellung werden überhaupt keine Übereinstimmungen vorgenommen.
Die marker_minimum_number_of_matches
ist für die Posenschätzung erforderlich. Zur Berechnung der translation
und rotation
sind mindestens 4 übereinstimmende Punkte erforderlich. Allerdings ist die Schätzung umso präziser, je mehr Übereinstimmungen für die Transformation erforderlich sind. Wenn die Einstellung zu hoch ist, funktioniert die Posenschätzung nur in wenigen Frames.
Schließlich legt pose_estimation_running_average
fest, wie viele Frames der Positionsdaten gemittelt werden sollen. Erhöhen Sie diese Zahl, wenn die zurückgegebenen Positionen zu „ruckartig“ sind. Je mehr Frames jedoch gemittelt werden, desto größer ist die Verzögerung.
Darüber hinaus kann jeder colour
eine beliebige natürliche Zahl zwischen 0
und 255
sein. Die marker_feature_colour_*
Elemente dienen dazu, den Ort der qualitativ guten Übereinstimmungen zwischen dem Markierungsbild und dem Kamerabild anzuzeigen. Die marker_indicator_colour_*
Einstellungen bestimmen die Farbe eines einzelnen Indikators, der die Koordinaten anzeigt, die aus den Mittelwerten der angezeigten Übereinstimmungen berechnet werden. Idealerweise sollte sich dieser Indikator immer innerhalb der Markierung befinden und im UDP-Paket als centroid
zurückgegeben werden.
marker_feature_colour_R = <0...255>
marker_feature_colour_G = <0...255>
marker_feature_colour_B = <0...255>
marker_indicator_colour_R = <0...255>
marker_indicator_colour_G = <0...255>
marker_indicator_colour_B = <0...255>
python tracker_main.py
Viel Glück!