Apriltag es un sistema fiducial visual popular en la investigación de robótica. Este repositorio contiene la versión más reciente de Apriltag, Apriltag 3, que incluye un detector más rápido (> 2x), una tasa de detección mejorada en etiquetas pequeñas, diseños de etiquetas flexibles y estimación de pose. Apriltag consiste en una pequeña biblioteca C con dependencias mínimas.
Puede encontrar imágenes de etiquetas para los diseños precenerados aquí. Recomendamos usar el diseño TagStandard41H12.
Apriltag es el tema de los siguientes documentos.
Apriltag: un sistema fiducial visual robusto y flexible
Apriltag 2: detección fiducial eficiente y robusta
Diseños flexibles para etiquetas fiduciales
Oficialmente, solo se admiten sistemas operativos de Linux, aunque los usuarios también han tenido éxito en Windows.
La instalación predeterminada colocará encabezados en/usr/local/incluir y biblioteca compartida en/usr/local/lib. También instala un script PKG-config en/usr/local/lib/pkgconfig e instalará un envoltorio de python si se instala Python3.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Esto construirá bibliotecas compartidas (*.so) de forma predeterminada. Si necesita bibliotecas static (*.a) establece BUILD_SHARED_LIBS
para OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
Si tiene instalado Ninja ( sudo apt install ninja-build
), puede usar:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Para generar y compilar a través del script Ninja Build. Será mucho más rápido que con el generador de makfile predeterminado de Cmake.
Puede omitir --target install
si solo desea usar esto localmente sin instalar.
Para la gran mayoría de las aplicaciones, la familia Tagstandard41H12 será la opción correcta. Puede encontrar las imágenes para las etiquetas en el repositorio Apriltag-IMGS. Escala las imágenes de su editor favorito e imprímalo.
Algunas heurísticas para cuándo elegir otras familias de etiquetas:
Si ninguno de estos satisface sus necesidades, genere su propia familia de etiquetas personalizada aquí.
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)
Alternativamente, puede usar las enlaces Apriltag Python creadas por 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);
Proporcionado por terceros aquí.
Proporcionado por terceros aquí
Para la mayoría de los casos de uso, esto debería ser una caída en el reemplazo.
Tenga en cuenta que esta biblioteca no tiene dependencias externas. La mayoría de las aplicaciones requerirán, como mínimo, un método para adquirir imágenes.
Consulte Ejemplo/OpenCV_Demo.cc para un ejemplo de uso de Apriltag en C ++ con OpenCV. Esta aplicación de ejemplo se puede construir ejecutando lo siguiente:
$ cd examples
$ make opencv_demo
Los datos de imagen en un objeto CV :: MAT se pueden pasar a Apriltag sin crear una copia profunda. Simplemente cree un encabezado Image_U8_T para el búfer de datos CV :: MAT:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
Aumentar el parámetro quad_decimate aumentará la velocidad del detector a costa de la distancia de detección. Si tiene núcleos de CPU adicionales para lanzar el problema, puede aumentar los NTHREADS. Si su imagen es algo ruidosa, aumentar el parámetro Quad_sigma puede aumentar la velocidad.
Primero elija una imagen de ejemplo y ejecute el detector con Debug = 1 para generar las imágenes de depuración. Estos muestran la salida del detector en cada paso de la tubería de detección. Si el borde de su etiqueta no se detecta como un cuadrilátero, disminuya quad_decimate (hasta 1 si es necesario). Si se detecta el borde de la etiqueta, experimente con el cambio de decode_sharpening.
Proporcionamos un método para calcular la pose de la etiqueta de la siguiente manera (use alternativamente el solucionador PNP de OpenCV con solvepnp_ippe_square). Deberá incluir el archivo de encabezado apriltag_pose.h y luego llamar a la función estimado_tag_pose de la siguiente manera:
// 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.
...
donde los parámetros son los siguientes:
det
: la estructura de detección de etiquetas (abril_detection_t).tagsize
: el tamaño de la etiqueta en metros. Cada diseño de etiqueta tiene un borde negro y un borde blanco, pero algunos diseños tienen el borde blanco en el interior y otros tienen el borde negro en el interior. El TagSize se mide de donde se encuentran los dos bordes, vea la figura a continuación para obtener un ejemplo.fx
, fy
: la distancia focal de la cámara (en píxeles). Para la mayoría de las cámaras, fx
y fy
serán iguales o casi.cx
, cy
: el centro focal de la cámara (en píxeles). Para la mayoría de las cámaras, esto será aproximadamente lo mismo que el centro de imágenes.Nota: El tamaño de la etiqueta no debe medirse desde el exterior de la etiqueta. El tamaño de la etiqueta se define como la distancia entre las esquinas de detección, o alternativamente, la longitud del borde entre el borde blanco y el borde negro. La siguiente ilustración marca las esquinas de detección con X Red XS y el tamaño de la etiqueta con una flecha roja para una etiqueta de la familia de etiquetas 48H12Custom.
El sistema de coordenadas tiene el origen en el centro de la cámara. El eje z apunta desde la cámara centrando la lente de la cámara. El eje X está a la derecha en la imagen tomada por la cámara, y Y está abajo. El marco de coordenadas de la etiqueta se centra en el centro de la etiqueta, con el eje X a la derecha, el eje y hacia abajo y el eje Z en la etiqueta.
Puede habilitar DirectSanitizer para depurar los problemas de memoria para las compilaciones de depuración estableciendo la opción ASAN
:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
Sobre todo, puede ejecutar sus ejecutables como de costumbre e inspeccionar la producción de sanitisers. Si recibe un mensaje como 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.
Tienes que precargar el correspondiente libasan.so.5
como este:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3 admite una amplia variedad de posibles diseños de etiquetas además del diseño clásico admitido en Apriltag 2. Los bits de datos de la etiqueta ahora pueden salir del borde de la etiqueta, y también es posible definir diseños con "agujeros" dentro de la etiqueta borde donde no hay bits de datos. En este repositorio hemos incluido:
Puede generar sus propias familias de etiquetas usando nuestro otro repositorio, Apriltag-Generation.
Cree un problema en este GitHub para cualquier pregunta en lugar de enviar un mensaje privado. Esto permite que otras personas con la misma pregunta encuentren su respuesta.