Ce sont des liaisons Python pour la bibliothèque Apriltags 3 développée par AprilRobotics. Inspiré par les liaisons Apriltags2 par Matt Zucker.
La bibliothèque originale est publiée avec une licence BSD 2 clause.
Vous pouvez installer en utilisant pip
(ou pip3
pour Python 3):
pip install dt-apriltags
Et si vous voulez une version particulière, ajoutez-le comme ceci:
pip install [email protected]
Clone ce référentiel et naviguez-y. Puis initialisez le sous-module APRILTAGS:
$ git submodule init
$ git submodule update
Construisez la bibliothèque APLILTAGS C et intégrez la bibliothèque nouvellement construite dans la roue PIP.
$ make build
La nouvelle roue sera disponible dans le répertoire dist/
. Vous pouvez maintenant installer la roue
pip install dt_apriltags-VERSION-pyPYMAJOR-none-ARCH.whl
Remarque: Sur la base de la VERSION
actuelle de cette bibliothèque et de la version de Python utilisée PYMAJOR
, ainsi que l'architecture de votre ARCH
CPU, le nom de fichier ci-dessus varie.
Cette bibliothèque prend en charge les roues de construction pour Python 2
et 3
. Python 2 sera utilisé par défaut. Utilisez la commande suivante pour construire pour Python 3.
make build PYTHON_VERSION=3
Cette bibliothèque prend en charge les roues de construction pour les architectures CPU amd64
, arm32v7
et arm64v8
. L'architecture par défaut est amd64
. Lors de la construction de roues pour des architectures de bras, QEMU sera utilisé pour imiter le CPU cible. Utilisez la commande suivante pour construire pour l'architecture arm32v7
.
make build ARCH=arm32v7
Toutes les roues construites à l'intérieur dist/
peuvent être libérées (poussées sur PYPI.org) en exécutant la commande
make upload
Utilisez la commande suivante pour construire et libérer des roues pour Python 2 et 3 et l'architecture CPU amd64
et arm32v7
.
make release-all
Quelques exemples d'utilisation peuvent être vus dans le fichier test.py
La classe Detector
est un emballage autour de la fonctionnalité Apriltags. Vous pouvez l'initialiser comme suivant:
at_detector = Detector(searchpath=['apriltags'],
families='tag36h11',
nthreads=1,
quad_decimate=1.0,
quad_sigma=0.0,
refine_edges=1,
decode_sharpening=0.25,
debug=0)
Les options sont:
Option | Défaut | Explication |
---|---|---|
familles | 'Tag36h11' | Tag Families, séparées avec un espace |
nthreads | 1 | Nombre de fils |
max_hamming | 2 | Le nombre maximum de bits qui peuvent être inversés pour générer une détection de balises réussie. Peut aider à réduire les faux négatifs lorsque le bruit entraîne une lecture de certains bits de données, mais peut également augmenter les faux positifs. |
quad_decim | 2.0 | La détection des quads peut être effectuée sur une image à faible résolution, améliorant la vitesse à un coût de précision de la pose et une légère diminution du taux de détection. Le décodage de la charge utile binaire se fait toujours en pleine résolution. Réglez ceci sur 1.0 pour utiliser la résolution complète. |
quad_sigma | 0.0 | Quel flou gaussien doit être appliqué à l'image segmentée. Le paramètre est l'écart type dans les pixels. Les images très bruyantes bénéficient de valeurs non nulles (par exemple 0,8) |
affiner_edges | 1 | Lorsqu'ils sont non nuls, les bords de chaque quad sont ajustés à "Scoure à" de forts gradients à proximité. Ceci est utile lorsque la décimation est utilisée, car elle peut augmenter considérablement la qualité de l'estimation du quad initial. Généralement recommandé d'être sur (1). Très peu coûteux. L'option est ignorée si quad_decimate = 1 |
décode_sharpening | 0,25 | Quelle affûtage doit être effectuée pour décoder les images? Cela peut aider à décoder de petites étiquettes, mais peut ou non aider à des conditions d'éclairage étranges ou à des conditions de faible luminosité |
chemin de recherche | ['Apriltags'] | Où chercher la bibliothèque Apriltag 3, doit être une liste |
déboguer | 0 | Si 1, enregistrera les images de débogage. Fonctionne très lentement |
La détection des étiquettes dans les images est effectuée en exécutant la méthode detect
du détecteur:
tags = at_detector.detect(img, estimate_tag_pose=False, camera_params=None, tag_size=None)
Si vous souhaitez également extraire la pose de balise, estimate_tag_pose
doit être réglé sur True
et camera_params
( [fx, fy, cx, cy]
) et tag_size
(en mètres) doivent être fournies. La méthode detect
renvoie une liste d'objets Detection
ayant chacun les attributs suivants (notez que ceux avec des astérisques sont calculés uniquement si estimate_tag_pose=True
):
Attribut | Explication |
---|---|
tag_family | La famille de l'étiquette. |
tag_id | L'ID décodé de la balise. |
coup de fouet | Combien de bits d'erreur ont été corrigés? Remarque: l'acceptation d'un grand nombre d'erreurs corrigées conduit à une augmentation des taux de faux positifs augmentés. Remarque: à partir de cette implémentation, le détecteur ne peut pas détecter des balises avec une distance de Hamming supérieure à 3. |
décision_margin | Une mesure de la qualité du processus de décodage binaire: la différence moyenne entre l'intensité d'un bit de données par rapport au seuil de décision. Des nombres plus élevés indiquent grossièrement de meilleurs décodes. Il s'agit d'une mesure raisonnable de la précision de détection uniquement pour les très petites étiquettes - non efficaces pour les étiquettes plus grandes (où nous aurions pu échantillonner n'importe où dans une cellule un peu et avoir toujours une bonne détection.) |
homographie | La matrice d'homographie 3x3 décrivant la projection d'une étiquette "idéale" (avec des coins à (-1,1), (1,1), (1, -1) et (-1, -1)) aux pixels dans le image. |
centre | Le centre de la détection dans l'image des pixels coordonnées. |
coins | Les coins de la balise dans l'image des pixels coordonnées. Ceux-ci s'enroulent toujours sur le contre-horaire autour de la balise. |
poseur* | Matrice de rotation de l'estimation de la pose. |
pose_t * | Traduction de l'estimation de la pose. |
pose_err * | Erreur d'espace d'objet de l'estimation. |
Si vous souhaitez utiliser une mise en page personnalisée, vous devez créer la source C et les fichiers d'en-tête pour lui, puis reprendre la bibliothèque. Utilisez ensuite la nouvelle bibliothèque libapriltag.so
. Vous pouvez trouver plus d'informations sur le référentiel d'origine Apriltags.
La roue est construite à l'intérieur d'un conteneur Docker. Le dockerfile à la racine de ce référentiel est un modèle pour l'environnement de construction. L'environnement de construction est basé sur ubuntu:18.04
et la version correcte de Python est installée à la volée. La commande make build
créera l'environnement de construction s'il n'existe pas avant de construire la roue.
Une fois que l'environnement de construction (image docker) est prêt, un conteneur Docker est lancé avec la configuration suivante:
/source
;dist/
est monté sous forme de répertoire de destination sous /out
; Le script de construction de assets/build.sh
sera exécuté à l'intérieur du conteneur. Les étapes de construction sont:
/source
à un emplacement temporaire (à l'intérieur du conteneur)apriltags/
(produira un fichier de bibliothèque .so)package_data
)/out
(apparaîtra dans dist/
à l'extérieur du conteneur)