Estas são ligações Python para a biblioteca Apriltags 3 desenvolvidas pela AprilroBotics. Inspirado nas ligações Apriltags2 por Matt Zucker.
A biblioteca original é publicada com uma licença de cláusula 2 BSD.
Você pode instalar usando pip
(ou pip3
para Python 3):
pip install dt-apriltags
E se você quiser um lançamento específico, adicione assim:
pip install [email protected]
Clone este repositório e navegue nele. Em seguida, inicialize o submódulo Apriltags:
$ git submodule init
$ git submodule update
Construa a biblioteca Apriltags C e incorpore a biblioteca recém-construída na roda PIP.
$ make build
A nova roda estará disponível no diretório dist/
. Agora você pode instalar a roda
pip install dt_apriltags-VERSION-pyPYMAJOR-none-ARCH.whl
Nota: Com base na VERSION
atual desta biblioteca e na versão do Python usada PYMAJOR
, juntamente com a arquitetura do seu ARCH
da CPU, o nome do arquivo acima varia.
Esta biblioteca suporta rodas de construção para Python 2
e 3
. O Python 2 será usado por padrão. Use o seguinte comando para construir para o Python 3.
make build PYTHON_VERSION=3
Esta biblioteca suporta rodas de construção para as arquiteturas da CPU amd64
, arm32v7
e arm64v8
. A arquitetura padrão é amd64
. Ao construir rodas para arquiteturas de braço, o Qemu será usado para imitar a CPU alvo. Use o seguinte comando para construir para a arquitetura arm32v7
.
make build ARCH=arm32v7
Todas as rodas construídas dentro dist/
podem ser lançadas (empurradas para Pypi.org) executando o comando
make upload
Use o seguinte comando para construir e liberar rodas para Python 2 e 3 e arquitetura da CPU amd64
e arm32v7
.
make release-all
Alguns exemplos de uso podem ser vistos no arquivo test.py
A classe Detector
é um invólucro em torno da funcionalidade Apriltags. Você pode inicializá -lo como seguinte:
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)
As opções são:
Opção | Padrão | Explicação |
---|---|---|
famílias | 'TAG36H11' | Famílias de etiquetas, separadas com um espaço |
nthreads | 1 | Número de threads |
max_hamming | 2 | O número máximo de bits que podem ser invertidos para gerar uma detecção de tag bem -sucedida. Pode ajudar a diminuir os falsos negativos quando o ruído faz com que alguns bits de dados sejam lidos incorretamente, mas também podem aumentar os falsos positivos. |
Quad_Decimate | 2.0 | A detecção de quads pode ser feita em uma imagem de menor resolução, melhorando a velocidade a um custo de precisão da pose e uma ligeira diminuição na taxa de detecção. A decodificação da carga útil binária ainda é feita com resolução total. Defina isso como 1.0 para usar a resolução completa. |
quad_sigma | 0,0 | O que Gaussian Blur deve ser aplicado à imagem segmentada. O parâmetro é o desvio padrão em pixels. Imagens muito barulhentas se beneficiam dos valores diferentes de zero (por exemplo, 0,8) |
refine_edges | 1 | Quando diferentes de zero, as bordas de cada quad são ajustadas para "encaixar" gradientes fortes nas proximidades. Isso é útil quando a dizimação é empregada, pois pode aumentar substancialmente a qualidade da estimativa inicial do quad. Geralmente recomendado para estar em (1). Muito computacionalmente barato. A opção é ignorada se quad_decimate = 1 |
decode_sharpening | 0,25 | Quanta nitidez deve ser feita para imagens decodificadas? Isso pode ajudar |
SearchPath | ['Apriltags'] | Onde procurar a biblioteca de Apriltag 3, deve ser uma lista |
depurar | 0 | Se 1, salvará imagens de depuração. Corre muito lento |
A detecção de tags nas imagens é feita executando o método detect
do detector:
tags = at_detector.detect(img, estimate_tag_pose=False, camera_params=None, tag_size=None)
Se você também deseja extrair a pose da tag, estimate_tag_pose
deve ser definido como True
e camera_params
( [fx, fy, cx, cy]
) e tag_size
(em metros) devem ser fornecidos. O método detect
retorna uma lista de objetos Detection
, cada um com os seguintes atributos (observe que os com asteriscos são calculados apenas se estimate_tag_pose=True
):
Atributo | Explicação |
---|---|
tag_family | A família da etiqueta. |
tag_id | O ID decodificado da tag. |
Hamming | Quantos bits de erro foram corrigidos? NOTA: Aceitar um grande número de erros corrigidos leva a um aumento muito falso das taxas positivas. Nota: A partir desta implementação, o detector não pode detectar tags com uma distância de hamming superior a 3. |
Decision_margin | Uma medida da qualidade do processo de decodificação binária: a diferença média entre a intensidade de um bit de dados versus o limite de decisão. Números mais altos indicam aproximadamente melhores decodões. Essa é uma medida razoável de precisão de detecção apenas para etiquetas muito pequenas- não é eficaz para tags maiores (onde poderíamos ter amostrado em qualquer lugar dentro de uma célula bit e ainda obtém uma boa detecção.) |
Homografia | A matriz de homografia 3x3 descrevendo a projeção de uma etiqueta "ideal" (com cantos em (-1,1), (1,1), (1, -1) e (-1, -1)) para pixels no imagem. |
centro | O centro da detecção nas coordenadas de pixels de imagem. |
cantos | Os cantos da tag nas coordenadas de pixels de imagem. Estes sempre envolvem o bairro em torno da etiqueta. |
pose_r* | Matriz de rotação da estimativa da pose. |
pose_t* | Tradução da estimativa da pose. |
pose_err* | Erro de espaço de objeto da estimativa. |
Se você deseja usar um layout personalizado, precisará criar os arquivos de origem e cabeçalho C para ele e criar a biblioteca novamente. Em seguida, use a nova biblioteca libapriltag.so
. Você pode encontrar mais informações sobre o repositório de Apriltags original.
A roda é construída dentro de um recipiente do docker. O DockerFile na raiz deste repositório é um modelo para o ambiente de construção. O ambiente de construção é baseado no ubuntu:18.04
e a versão correta do Python é instalada em tempo real. O comando make build
criará o ambiente de construção se não existir antes de construir a roda.
Depois que o ambiente de construção (imagem do docker) estiver pronto, um recipiente do docker é lançado com a seguinte configuração:
/source
;dist/
é montado como diretório de destino abaixo /out
; O script de construção de assets/build.sh
será executado dentro do contêiner. As etapas de construção são:
/source
para um local de temperatura (dentro do contêiner)apriltags/
(produzirá um arquivo de biblioteca .so)package_data
)/out
(aparecerá no dist/
fora do contêiner)