Apriltag est un système fiduciaire visuel populaire dans la recherche en robotique. Ce référentiel contient la version la plus récente d'Apriltag, Apriltag 3, qui comprend un détecteur plus rapide (> 2x), un taux de détection amélioré sur de petites étiquettes, des dispositions de balises flexibles et une estimation de la pose. Apriltag se compose d'une petite bibliothèque C avec des dépendances minimales.
Vous pouvez trouver des images de balises pour les dispositions pré-générées ici. Nous vous recommandons d'utiliser la disposition TagStandard41H12.
Apriltag fait l'objet des articles suivants.
Apriltag: un système fiducial visuel robuste et flexible
Apriltag 2: détection fiduciaire efficace et robuste
Dispositions flexibles pour les étiquettes fiduciales
Officiellement, seuls les systèmes d'exploitation Linux sont pris en charge, bien que les utilisateurs aient également réussi à s'installer sur Windows.
L'installation par défaut placera les en-têtes dans / usr / local / include et la bibliothèque partagée dans / usr / local / lib. Il installe également un script PKG-Config dans / usr / local / lib / pkgconfig et installera un wrapper python si Python3 est installé.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Cela créera des bibliothèques partagées (* .so) par défaut. Si vous avez besoin de bibliothèques statiques (* .a), définissez BUILD_SHARED_LIBS
à OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
Si vous avez installé Ninja ( sudo apt install ninja-build
), vous pouvez utiliser:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Pour générer et compiler via le script Ninja Build. Il sera beaucoup plus rapide qu'avec le générateur de makefile par défaut de CMake.
Vous pouvez omettre --target install
si vous souhaitez l'utiliser localement sans installer.
Pour la grande majorité des applications, la famille Tagstandard41h12 sera le bon choix. Vous pouvez trouver les images pour les balises dans le dépôt d'abiltag-IMGS. Élaborez les images de votre éditeur préféré et imprimez-les.
Certaines heuristiques pour choisir d'autres familles de balises:
Si aucun de ces éléments ne correspond à vos besoins, générez votre propre famille de balises personnalisée ici.
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)
Alternativement, vous pouvez utiliser les liaisons Apriltag Python créées par Duckietown.
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);
Fourni par un tiers ici.
Fourni par un tiers ici
Pour la plupart des cas d'utilisation, cela devrait être une baisse du remplacement.
Notez que cette bibliothèque n'a pas de dépendances externes. La plupart des applications nécessiteront, au minimum, une méthode pour acquérir des images.
Voir Exemple / OPENCV_DEMO.CC pour un exemple d'utilisation de APRILTAG en C ++ avec OpenCV. Cet exemple d'application peut être construit en exécutant ce qui suit:
$ cd examples
$ make opencv_demo
Les données d'image dans un objet CV :: MAT peuvent être transmises à Apriltag sans créer de copie profonde. Créez simplement un en-tête Image_U8_T pour le tampon de données CV :: MAT:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
L'augmentation du paramètre quad_decimate augmentera la vitesse du détecteur au coût de la distance de détection. Si vous avez des cœurs CPU supplémentaires à lancer sur le problème, vous pouvez augmenter les nthreads. Si votre image est quelque peu bruyante, l'augmentation du paramètre Quad_Sigma peut augmenter la vitesse.
Choisissez d'abord un exemple d'image et exécutez le détecteur avec Debug = 1 pour générer les images de débogage. Ceux-ci montrent la sortie du détecteur à chaque étape du pipeline de détection. Si la bordure de votre étiquette n'est pas détectée en quadrilatère, diminuera quad_decimate (jusqu'à 1 si nécessaire). Si la bordure de la balise est détectée, expérimentez avec le changement de decode_sharpening.
Nous fournissons une méthode pour calculer la pose de la balise comme suit (utilisons alternativement le solveur PNP d'OpenCV avec SolvePNP_IPPE_SQUARE). Vous devrez inclure le fichier d'en-tête APRILTAG_POSE.H, puis appeler la fonction ESTIMATE_TAG_POSE comme suit:
// 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.
...
où les paramètres sont les suivants:
det
: La structure de détection de balise (avril_detection_t).tagsize
: la taille de la balise en mètres. Chaque conception de balises a une bordure noire et une bordure blanche, mais certains designs ont la bordure blanche à l'intérieur et certaines ont la bordure noire à l'intérieur. Le tagsize est ainsi mesuré à partir de l'endroit où les deux frontières se rencontrent, voir la figure ci-dessous pour un exemple.fx
, fy
: La distance focale de la caméra (en pixels). Pour la plupart des caméras, fx
et fy
seront égaux ou presque.cx
, cy
: Le centre focal de la caméra (en pixels). Pour la plupart des caméras, ce sera à peu près le même que le centre d'image.Remarque: La taille de la balise ne doit pas être mesurée de l'extérieur de la balise. La taille de l'étiquette est définie comme la distance entre les coins de détection, ou alternativement, la longueur du bord entre la bordure blanche et la bordure noire. L'illustration suivante marque les coins de détection avec des X rouges et la taille de la balise avec une flèche rouge pour une étiquette de la famille TAG 48H12Custom.
Le système de coordonnées a l'origine au centre de la caméra. Les points de l'axe Z de l'appareil photo centrent la lentille de la caméra. L'axe X est à droite dans l'image prise par la caméra, et Y est en baisse. Le cadre de coordonnées de la balise est centré au centre de la balise, avec l'axe x vers la droite, l'axe y vers le bas et l'axe z dans la balise.
Vous pouvez activer AddressSanitizer pour déboguer les problèmes de mémoire pour les versions de débogage en définissant l'option ASAN
:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
La plupart du temps, vous pouvez ensuite exécuter vos exécutables comme d'habitude et inspecter la sortie de la désinfection. Si vous obtenez un message comme 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.
Vous devez précharger le libasan.so.5
correspondant.
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3 prend en charge une grande variété de dispositions de balises possibles en plus de la disposition classique prise en charge dans Apriltag 2. bordure où il n'y a pas de bits de données. Dans ce dépôt, nous avons inclus:
Vous pouvez générer vos propres familles de balises en utilisant notre autre référentiel, Apriltag-Generation.
Veuillez créer un problème sur ce github pour toutes les questions au lieu d'envoyer un message privé. Cela permet à d'autres personnes avec la même question de trouver votre réponse.