Apriltag - это визуальная фидуциальная система, популярная в исследованиях робототехники. Этот репозиторий содержит самую последнюю версию Apriltag, Apriltag 3, которая включает в себя более быстрый (> 2x) детектор, улучшенную скорость обнаружения на небольших тегах, гибкие макеты тегов и оценку позы. Apriltag состоит из небольшой библиотеки C с минимальными зависимостями.
Вы можете найти изображения тегов для предварительно сгенерированных макетов здесь. Мы рекомендуем использовать макет Tagstandard41h12.
Apriltag является предметом следующих документов.
Apriltag: надежная и гибкая визуальная фидуциальная система
Apriltag 2: Эффективное и надежное фидуциальное обнаружение
Гибкие макеты для фирминных тегов
Официально поддерживаются только операционные системы Linux, хотя пользователи имели успех в установке в Windows.
Установка по умолчанию будет размещать заголовки в/usr/local/include и общая библиотека в/usr/local/lib. Он также устанавливает скрипт PKG-Config в/usr/local/lib/pkgconfig и установит обертку Python, если Python3 установлен.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Это по умолчанию создаст общие (*.so) библиотеки. Если вам нужны статические (*.A) библиотеки, установите BUILD_SHARED_LIBS
для OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
Если у вас установлен Ninja ( sudo apt install ninja-build
), вы можете использовать:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Чтобы генерировать и компилировать через сценарий строительства ниндзя. Это будет намного быстрее, чем в генераторе Makefile Cmake по умолчанию.
Вы можете опустить --target install
, если вы хотите использовать это локально без установки.
Для подавляющего большинства приложений семья Tagstandard41h12 будет правильным выбором. Вы можете найти изображения для тегов в репозиции Apriltag-Imgs. Расскажите изображения в вашем любимом редакторе и распечатайте их.
Некоторая эвристика для выбора других семей с меткой:
Если ни один из них не соответствует вашим потребностям, генерируйте здесь свою собственную семью тегов.
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)
С другой стороны, вы можете использовать привязки Python Apriltag, созданные 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);
Предоставлено здесь третьей стороной.
Предоставлено здесь третьей стороной
Для большинства случаев использования это должно быть падение замены.
Обратите внимание, что эта библиотека не имеет внешних зависимостей. Большинство приложений потребуют, как минимум, метод получения изображений.
См. Пример/opencv_demo.cc для примера использования апрельдж в C ++ с OpenCV. Этот пример приложения может быть создан путем выполнения следующего:
$ cd examples
$ make opencv_demo
Данные изображения в объекте CV :: MAT могут быть переданы в Apriltag, не создавая глубокую копию. Просто создайте заголовок image_u8_t для буфера данных CV :: MAT:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
Увеличение параметра Quad_Decimate увеличит скорость детектора за счет расстояния обнаружения. Если у вас есть дополнительные ядра процессора, чтобы бросить проблему, вы можете увеличить nthreads. Если ваше изображение несколько шумно, увеличение параметра Quad_sigma может увеличить скорость.
Сначала выберите пример изображения и запустите детектор с помощью Debug = 1, чтобы генерировать изображения отладки. Они показывают вывод детектора на каждом этапе в трубопроводе обнаружения. Если граница вашего тега не обнаруживается как четырехугольник, уменьшите Quad_Decimate (вплоть до 1, если это необходимо). Если граница тега обнаружена, экспериментируйте с изменением decode_sharpening.
Мы предоставляем метод вычисления позы тега следующим образом (альтернативно используем решатель PNP OpenCV с помощью solvepnp_ippe_square). Вам нужно будет включить файл заголовка apriltag_pose.h, а затем вызовать функцию exatime_tag_pose следующим образом:
// 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.
...
где параметры следующие:
det
: структура обнаружения тега (April_detection_t).tagsize
: размер тега в метрах. Каждый дизайн тега имеет черную границу и белую границу, но в некоторых дизайнах есть белая граница внутри, а у некоторых есть черная граница внутри. Таким образом, TAGSIZE измеряется от того, где встречаются две границы, см. Рисунок ниже для примера.fx
, fy
: фокусное расстояние камеры (в пикселях). Для большинства камер fx
и fy
будут равны или почти так.cx
, cy
: Фокальный центр камеры (в пикселях). Для большинства камер это будет приблизительно так же, как Центр изображений.ПРИМЕЧАНИЕ. Размер тега не должен измеряться снаружи тега. Размер метки определяется как расстояние между углами обнаружения или попеременно, длина края между белой границей и черной границей. Следующая иллюстрация отмечает углы обнаружения с красным XS и размер тега с красной стрелкой для тега из семейства тегов 48H12Custom.
Система координат имеет происхождение в центре камеры. Ошины Z-оси от камеры центрируют объектив камеры. Ось X находится справа на изображении, снятом камерой, и Y падает. Координатная кадр тега центрирована в центре тега, с осью X вправо, осью y вниз и осью Z в тег.
Вы можете включить AddressSanitizer отладки вопросами памяти для отладки сборки, установив опцию ASAN
:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
В основном вы можете затем запустить свои исполняемые файлы как обычно и проверить производство дезифан. Если у вас есть сообщение, как 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.
Вы должны предварительно загрузить соответствующий libasan.so.5
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3 поддерживает широкий спектр возможных макетов метки в дополнение к классической макете, поддерживаемой в Apriltag 2. Биты данных тега теперь могут выходить за пределы границы тегов, и также можно определить макеты с «отверстиями» внутри тега граница там, где нет битов данных. В этом репо, мы включили:
Вы можете генерировать свои собственные семейства тегов, используя нашу другое репо, генерация Apriltag.
Пожалуйста, создайте проблему на этом GitHub для любых вопросов вместо того, чтобы отправлять личное сообщение. Это позволяет другим людям с тем же вопросом найти ваш ответ.