Estas son enlaces de Python para la biblioteca Apriltags 3 desarrollada por Aprilrobotics. Inspirado en las enlaces Apriltags2 por Matt Zucker.
La biblioteca original se publica con una licencia BSD 2 cláusula.
Puede instalar usando pip
(o pip3
para Python 3):
pip install dt-apriltags
Y si desea una versión en particular, agrégela así:
pip install [email protected]
Clonar este repositorio y navegar en él. Luego inicialice el submódulo AprilTags:
$ git submodule init
$ git submodule update
Construya la biblioteca Apriltags C e incrusta la biblioteca recién construida en la rueda Pip.
$ make build
La nueva rueda estará disponible en el directorio dist/
. Ahora puedes instalar la rueda
pip install dt_apriltags-VERSION-pyPYMAJOR-none-ARCH.whl
Nota: Basado en la VERSION
actual de esta biblioteca y la versión de Python usó PYMAJOR
, junto con la arquitectura de su ARCH
de CPU, el nombre de archivo anterior varía.
Esta biblioteca es compatible con las ruedas de construcción para Python 2
y 3
. Python 2 se utilizará de forma predeterminada. Use el siguiente comando para construir para Python 3.
make build PYTHON_VERSION=3
Esta biblioteca admite ruedas de construcción para las arquitecturas de la CPU amd64
, arm32v7
y arm64v8
. La arquitectura predeterminada es amd64
. Al construir ruedas para arquitecturas de brazo, QEMU se utilizará para emular la CPU objetivo. Use el siguiente comando para construir para la arquitectura arm32v7
.
make build ARCH=arm32v7
Todas las ruedas construidas dentro dist/
se pueden liberar (empujado a pypi.org) ejecutando el comando
make upload
Use el siguiente comando para construir y liberar ruedas para Python 2 y 3 y la arquitectura de CPU amd64
y arm32v7
.
make release-all
Algunos ejemplos de uso se pueden ver en el archivo test.py
La clase Detector
es un envoltorio alrededor de la funcionalidad Apriltags. Puede inicializarlo como lo sigue:
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)
Las opciones son:
Opción | Por defecto | Explicación |
---|---|---|
familias | 'TAG36H11' | Familias de etiqueta, separadas con un espacio |
nthreads | 1 | Número de hilos |
max_hamming | 2 | El número máximo de bits que se permite voltear para generar una detección de etiquetas exitosa. Puede ayudar a disminuir los falsos negativos cuando el ruido hace que algunos bits de datos se lean incorrectamente, pero también pueden aumentar los falsos positivos. |
quad_decimate | 2.0 | La detección de quads se puede hacer en una imagen de menor resolución, mejorando la velocidad a un costo de precisión de pose y una ligera disminución en la tasa de detección. La decodificación de la carga útil binaria todavía se realiza a resolución completa. Establezca esto en 1.0 para usar la resolución completa. |
quad_sigma | 0.0 | Qué desenfoque gaussiano debe aplicarse a la imagen segmentada. El parámetro es la desviación estándar en los píxeles. Las imágenes muy ruidosas se benefician de los valores no cero (por ejemplo, 0.8) |
refinar_edges | 1 | Cuando no es cero, los bordes de cada quad se ajustan a los gradientes de "complemento a" cercanos. Esto es útil cuando se emplea la decimación, ya que puede aumentar sustancialmente la calidad de la estimación de Quad inicial. Generalmente recomendado para estar en (1). Muy económicamente económico. La opción se ignora si quad_decimate = 1 |
decode_sharpening | 0.25 | ¿Cuánto afilado se debe hacer a las imágenes decodificadas? Esto puede ayudar a decodificar etiquetas pequeñas, pero puede o no ayudar en condiciones de iluminación impares o condiciones de baja luz |
búsqueda de la búsqueda | ['Apriltags'] | Dónde buscar la biblioteca Apriltag 3 debe ser una lista |
depurar | 0 | Si 1 guardará imágenes de depuración. Corre muy lento |
La detección de etiquetas en las imágenes se realiza ejecutando el método detect
del detector:
tags = at_detector.detect(img, estimate_tag_pose=False, camera_params=None, tag_size=None)
Si también desea extraer la pose de la etiqueta, estimate_tag_pose
debe establecerse en True
y camera_params
( [fx, fy, cx, cy]
) y tag_size
(en metros) deben ser suministrados. El método detect
devuelve una lista de objetos Detection
, cada uno que tiene los siguientes atributos (tenga en cuenta que los que tienen un asteriscos se calculan solo si estimate_tag_pose=True
):
Atributo | Explicación |
---|---|
tag_family | La familia de la etiqueta. |
tag_id | La ID decodificada de la etiqueta. |
hamming | ¿Cuántos bits de error se corrigieron? Nota: Aceptar grandes cantidades de errores corregidos conduce a tasas falsas positivas en gran medida. Nota: A partir de esta implementación, el detector no puede detectar etiquetas con una distancia de hamming superior a 3. |
decisión_margin | Una medida de la calidad del proceso de decodificación binaria: la diferencia promedio entre la intensidad de un bit de datos versus el umbral de decisión. Los números más altos indican aproximadamente mejores decodes. Esta es una medida razonable de precisión de detección solo para etiquetas muy pequeñas, no efectiva para etiquetas más grandes (donde podríamos haber probado en cualquier lugar dentro de una celda de bits y aún así obtener una buena detección). |
homografía | La matriz de homografía 3x3 que describe la proyección de una etiqueta "ideal" (con esquinas en (-1,1), (1,1), (1, -1) y (-1, -1)) a píxeles en el imagen. |
centro | El centro de la detección en coordenadas de píxeles de imagen. |
rincones | Las esquinas de la etiqueta en coordenadas de píxeles de imagen. Estos siempre envuelven en el contramunimiento en cuanto a la etiqueta. |
pregunta difícil* | Matriz de rotación de la estimación de pose. |
pose_t* | Traducción de la estimación de pose. |
pose_err* | Error del espacio de objeto de la estimación. |
Si desea usar un diseño personalizado, debe crear los archivos de la fuente C y el encabezado para ello y luego construir la biblioteca nuevamente. Luego use la nueva biblioteca libapriltag.so
. Puede encontrar más información sobre el repositorio original de Apriltags.
La rueda está construida dentro de un contenedor Docker. El Dockerfile en la raíz de este repositorio es una plantilla para el entorno de compilación. El entorno de compilación se basa en ubuntu:18.04
y la versión correcta de Python se instala sobre la mosca. El comando make build
creará el entorno de compilación si no existe antes de construir la rueda.
Una vez que el entorno de compilación (Docker Image) está listo, se inicia un contenedor Docker con la siguiente configuración:
/source
;dist/
se monta como directorio de destino bajo /out
; El script de construcción de assets/build.sh
se ejecutará dentro del contenedor. Los pasos de compilación son:
/source
a una ubicación temporal (dentro del contenedor)apriltags/
(producirá un archivo de biblioteca .so)package_data
)/out
(aparecerá en dist/
fuera del contenedor)