A APRITLAG é um sistema fiducial visual popular na pesquisa de robótica. Este repositório contém a versão mais recente do Apriltag, Apriltag 3, que inclui um detector mais rápido (> 2x), taxa de detecção aprimorada em pequenas tags, layouts de tags flexíveis e estimativa de pose. A APRITLAG consiste em uma pequena biblioteca C com dependências mínimas.
Você pode encontrar imagens de tag para os layouts pré-gerados aqui. Recomendamos o uso do layout TagStandard41H12.
APRITLAG é o assunto dos documentos a seguir.
Apriltag: um sistema fiducial visual robusto e flexível
Apriltag 2: Detecção fiducial eficiente e robusta
Layouts flexíveis para tags fiduciais
Oficialmente, apenas os sistemas operacionais Linux são suportados, embora os usuários também tenham tido sucesso no Windows.
A instalação padrão colocará os cabeçalhos em/usr/local/incluir e compartilhar biblioteca em/usr/local/lib. Ele também instala um script pkg-config em/usr/local/lib/pkgconfig e instalará um invólucro python se o python3 estiver instalado.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Isso criará bibliotecas compartilhadas (*.so) por padrão. Se você precisar de bibliotecas estáticas (*.a), defina BUILD_SHARED_LIBS
para OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
Se você tiver Ninja ( sudo apt install ninja-build
), você pode usar:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Para gerar e compilar através do script de construção ninja. Será muito mais rápido do que com o gerador Makefile padrão do CMAKE.
Você pode omitir --target install
se quiser usá -lo localmente sem instalar.
Para a grande maioria dos aplicativos, a família Tagstandard41H12 será a escolha correta. Você pode encontrar as imagens para as tags no repo Apriltag-IMGS. Escolha as imagens em seu editor favorito e imprimi -las.
Algumas heurísticas para quando escolher outras famílias de tags:
Se nenhum deles atender às suas necessidades, gerar sua própria família de tags personalizada aqui.
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)
Como alternativa, você pode usar as ligações Apriltag Python criadas 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);
Fornecido por terceiros aqui.
Fornecido por terceiros aqui
Para a maioria dos casos de uso, isso deve ser uma queda na substituição.
Observe que esta biblioteca não possui dependências externas. A maioria dos aplicativos exigirá, no mínimo, um método para adquirir imagens.
Consulte o exemplo/opencv_demo.cc para um exemplo de uso do aptiltag em C ++ com OpenCV. Este exemplo de aplicativo pode ser construído executando o seguinte:
$ cd examples
$ make opencv_demo
Os dados da imagem em um objeto CV :: MAT podem ser transmitidos para o APRITLAG sem criar uma cópia profunda. Basta criar um cabeçalho Image_U8_T para o buffer de dados CV :: MAT:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
Aumentar o parâmetro quad_decimate aumentará a velocidade do detector ao custo da distância de detecção. Se você possui núcleos extras de CPU para lançar o problema, poderá aumentar o NTHReads. Se a sua imagem for um pouco barulhenta, aumentar o parâmetro quad_sigma pode aumentar a velocidade.
Primeiro, escolha uma imagem de exemplo e execute o detector com depuração = 1 para gerar as imagens de depuração. Eles mostram a saída do detector em cada etapa do pipeline de detecção. Se a borda da sua tag não estiver sendo detectada como um quadrilátero, diminua o quad_decimato (até 1, se necessário). Se a borda da tag for detectada, experimente a alteração do decode_Sharpening.
Fornecemos um método para calcular a pose da tag da seguinte maneira (alternadamente, use o solucionador PNP do OpenCV com SOLVEPNP_IPPE_SQUARE). Você precisará incluir o arquivo de cabeçalho aptiltag_pose.h e depois chamar a função estimativa_tag_pose da seguinte forma:
// 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.
...
Onde os parâmetros são os seguintes:
det
: a estrutura de detecção de tags (April_DeTection_T).tagsize
: o tamanho da tag nos medidores. Cada design de tag tem uma borda preta e uma borda branca, mas alguns designs têm a borda branca por dentro e alguns têm a borda preta por dentro. O tagsize é assim medido de onde as duas fronteiras se encontram, veja a figura abaixo para obter um exemplo.fx
, fy
: A distância focal da câmera (em pixels). Para a maioria das câmeras fx
e fy
serão iguais ou quase assim.cx
, cy
: O centro focal da câmera (em pixels). Para a maioria das câmeras, isso será aproximadamente o mesmo que o centro de imagem.NOTA: O tamanho da tag não deve ser medido da parte externa da tag. O tamanho da etiqueta é definido como a distância entre os cantos de detecção, ou alternadamente, o comprimento da borda entre a borda branca e a borda preta. A ilustração a seguir marca os cantos de detecção com Xs vermelhos e o tamanho da tag com uma seta vermelha para uma tag da família 48H12Custom Tag.
O sistema de coordenadas tem a origem no centro da câmera. Os pontos do eixo z da câmera centralizam a lente da câmera. O eixo x está à direita na imagem tirada pela câmera, e Y está abaixado. O quadro de coordenadas da tag está centrado no centro da tag, com o eixo x à direita, eixo y para baixo e eixo z na tag.
Você pode permitir que o endereço do endereço de depuração de depurar questões de memória para criadas de depuração definindo a opção ASAN
:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
Principalmente, você pode executar seus executáveis como de costume e inspecionar a produção de desinfetante. Se você receber uma mensagem 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.
Você precisa pré -carregar o libasan.so.5
.
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3 suporta uma ampla variedade de layouts de tags possíveis, além do layout clássico suportado em Apriltag 2. Os bits de dados da tag agora podem sair da borda da tag, e também é possível definir layouts com "buracos" dentro da tag borda onde não há bits de dados. Neste repo, incluímos:
Você pode gerar suas próprias famílias de tags usando nosso outro repositório, a Apriltag-Geração.
Crie um problema neste github para qualquer dúvida em vez de enviar uma mensagem privada. Isso permite que outras pessoas com a mesma pergunta encontrem sua resposta.