Apriltag ist ein visuelles Fitucial -System, das in der Robotikforschung beliebt ist. Dieses Repository enthält die neueste Version von Apriltag, Apriltag 3, die einen schnelleren (> 2x) Detektor, eine verbesserte Erkennungsrate für kleine Tags, flexible Tag -Layouts und Pose -Schätzungen enthält. Apriltag besteht aus einer kleinen C -Bibliothek mit minimalen Abhängigkeiten.
Hier finden Sie Tag-Bilder für die vorgenerierten Layouts. Wir empfehlen das Layout von TagStandard41H12.
Apriltag ist Gegenstand der folgenden Papiere.
Apriltag: Ein robustes und flexibles visuelles Treuhandsystem
Apriltag 2: Effiziente und robuste Treuungserkennung
Flexible Layouts für Fituzentags
Offiziell werden offiziell nur Linux -Betriebssysteme unterstützt, obwohl Benutzer auch unter Windows eine Installation hatten.
In der Standardinstallation werden Header in/usr/local/inklusive Bibliothek in/usr/local/lib. Außerdem werden ein PKG-Konfigurations-Skript in/usr/local/lib/pkgconfig installiert und installiert einen Python-Wrapper, wenn Python3 installiert ist.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Dadurch werden standardmäßige gemeinsame (*.so) Bibliotheken erstellt. Wenn Sie statische (*.a) Bibliotheken benötigen, setzen Sie BUILD_SHARED_LIBS
OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
Wenn Sie Ninja ( sudo apt install ninja-build
) installiert ist, können Sie verwenden:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
über das Ninja Build -Skript zu erzeugen und zu kompilieren. Es wird viel schneller sein als mit dem Standard -Makefile -Generator von CMake.
Sie können --target install
weglassen, wenn Sie dies nur ohne Installation verwenden möchten.
Für die überwiegende Mehrheit der Anwendungen ist die Familie TagStandard41H12 die richtige Wahl. Sie finden die Bilder für die Tags im Apriltag-Imgs Repo. Skalieren Sie die Bilder in Ihrem Lieblingsredakteur und drucken Sie sie aus.
Einige Heuristiken für die Auswahl anderer Tag -Familien:
Wenn keine dieser Bedürfnisse zu Ihren Anforderungen entspricht, generieren Sie hier Ihre eigene benutzerdefinierte Tag -Familie.
import cv2
import numpy as np
from apriltag import apriltag
imagepath = 'test.jpg'
image = cv2.imread(imagepath, cv2.IMREAD_GRAYSCALE)
detector = apriltag("tagStandard41h12")
detections = detector.detect(image)
Alternativ können Sie die von Duckietown erstellten Apriltag -Python -Bindungen verwenden.
image_u8_t* im = image_u8_create_from_pnm("test.pnm");
if (im == NULL) {
fprintf(stderr, "Failed to load pnm image.n");
exit(1);
}
apriltag_detector_t *td = apriltag_detector_create();
apriltag_family_t *tf = tagStandard41h12_create();
apriltag_detector_add_family(td, tf);
zarray_t *detections = apriltag_detector_detect(td, im);
for (int i = 0; i < zarray_size(detections); i++) {
apriltag_detection_t *det;
zarray_get(detections, i, &det);
// Do stuff with detections here.
}
// Cleanup.
apriltag_detections_destroy(detections);
tagStandard41h12_destroy(tf);
apriltag_detector_destroy(td);
Angebot von Drittanbietern hier.
Von Drittanbietern zur Verfügung gestellt hier
Für die meisten Anwendungsfälle sollte dies ein Ersatzrückgang sein.
Beachten Sie, dass diese Bibliothek keine externen Abhängigkeiten hat. Die meisten Anwendungen erfordern mindestens eine Methode zum Erfassen von Bildern.
In Beispiel/opencv_demo.cc finden Sie ein Beispiel für die Verwendung von Apriltag in C ++ mit OpenCV. Diese Beispielanwendung kann erstellt werden, indem Folgendes ausgeführt wird:
$ cd examples
$ make opencv_demo
Bilddaten in einem CV :: MAT -Objekt können an Apriltag übergeben werden, ohne eine tiefe Kopie zu erstellen. Erstellen Sie einfach einen Image_U8_t -Header für den CV :: MAT -Datenpuffer:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
Durch Erhöhen des Parameters quad_decimate erhöht sich die Geschwindigkeit des Detektors auf Kosten des Erkennungsabstands. Wenn Sie zusätzliche CPU -Kerne auf das Problem werfen müssen, können Sie Nthreads erhöhen. Wenn Ihr Bild etwas laut ist, kann das Erhöhen des Quad_Sigma -Parameters die Geschwindigkeit erhöhen.
Wählen Sie zuerst ein Beispielbild aus und führen Sie den Detektor mit Debug = 1 aus, um die Debug -Bilder zu generieren. Diese zeigen die Ausgabe des Detektors bei jedem Schritt in der Erkennungspipeline. Wenn der Rand Ihres Tags nicht als Vierecker nachgewiesen wird, verringern Sie Quad_decimim (bei Bedarf bis auf 1). Wenn der Rand des Tags erkannt wird, experimentieren Sie mit dem Ändern von Decode_Sharpening.
Wir bieten eine Methode zur Berechnung der Pose des Tags wie folgt (verwenden Sie abwechselnd den PNP -Solver von OpenCV mit LELVEPNP_IPP_SQUARE). Sie müssen die Header -Datei acriltag_pin.h einfügen und dann die Funktion uaal_tag_pose wie folgt aufrufen:
// First create an apriltag_detection_info_t struct using your known parameters.
apriltag_detection_info_t info;
info.det = det;
info.tagsize = tagsize;
info.fx = fx;
info.fy = fy;
info.cx = cx;
info.cy = cy;
// Then call estimate_tag_pose.
apriltag_pose_t pose;
double err = estimate_tag_pose(&info, &pose);
// Do something with pose.
...
wo die Parameter wie folgt sind:
det
: Die Tag -Erkennungsstruktur (April_Detion_t).tagsize
: Die Größe des Tags in Metern. Jedes Tag -Design hat einen schwarzen Rand und einen weißen Rand, aber einige Designs haben den weißen Rand von innen und einige haben den schwarzen Rand von innen. Das TagSize wird somit von der Stelle gemessen, an der sich die beiden Grenzen treffen, siehe Abbildung unten für ein Beispiel.fx
, fy
: Die Brennweite der Kamera (in Pixeln). Für die meisten Kameras fx
und fy
sind gleich oder fast so.cx
, cy
: Das Fokuszentrum der Kamera (in Pixeln). Für die meisten Kameras ist dies ungefähr das gleiche wie das Image Center.HINWEIS: Die Tag -Größe sollte nicht von der Außenseite des Tags gemessen werden. Die Tag -Größe ist definiert als der Abstand zwischen den Erkennungs -Ecken oder abwechselnd die Länge der Kante zwischen dem weißen Rand und dem schwarzen Rand. Die folgende Abbildung markiert die Erkennungsecken mit roter XS und die Tag -Größe mit einem roten Pfeil für ein Tag aus der 48H12Custom -Tag -Familie.
Das Koordinatensystem hat den Ursprung in der Kamerazentrum. Die Z-Achse zeigt sich aus der Kamera im Kameraobjektiv. Die x-Achse ist rechts im Bild der Kamera und Y ist unten. Der Koordinatenrahmen des Tags befindet sich in der Mitte des Tags, mit x-Achse rechts, y-Achse und Z-Achse in das Tag.
Sie können es ermöglichen, dass Adressanitierer von Speicherproblemen für Debug -Builds debuggen, indem Sie die ASAN
-Option festlegen:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
Meistens können Sie Ihre ausführbaren Ausführungsfähigkeiten wie gewohnt ausführen und die Spritzdünniserleistung inspizieren. Wenn Sie eine Nachricht wie ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
Sie müssen den entsprechenden libasan.so.5
wie folgt vorladen:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3 unterstützt eine Vielzahl möglicher Tag -Layouts zusätzlich zu dem in Apriltag 2 unterstützten klassischen Layout Grenze, wo es keine Datenbits gibt. In diesem Repo haben wir aufgenommen:
Sie können Ihre eigenen Tag-Familien mit unserem anderen Repo, Apriltag-Generation, generieren.
Bitte erstellen Sie ein Problem in diesem GitHub für Fragen, anstatt eine private Nachricht zu senden. Dies ermöglicht es anderen Personen mit der gleichen Frage, Ihre Antwort zu finden.