Last translated: 26 Jun 2025

Translation Not Available Yet

This repository's README hasn't been translated yet. Once translated, it will be easier to read and understand in your native language (中文).

After translating, add the links to README so others can view it directly.

Biblioteca Independente para Detecção de AprilTag

Este é um kit de ferramentas para reconhecimento de AprilTag baseado na biblioteca pupil-apriltags, utilizado para detecção e rastreamento de AprilTags em câmeras.

Deutsch | English | Español | français | 日本語 | 한국어 | Português | Русский | 中文

Dependências

  • Python 3.6+
  • OpenCV
  • NumPy
  • pupil-apriltags

Instalação

  1. Certifique-se de ter o ambiente Python instalado
  2. Instale as dependências necessárias:
pip install opencv-python numpy pupil-apriltags

Como Usar

Uso Básico

import cv2
from apriltag import Detector, DetectorOptions

# 创建检测器
options = DetectorOptions(
    families="tag36h11",  # 标签家族
    border=1,             # 标签边框大小
    nthreads=4,           # 线程数量
    quad_decimate=1.0,    # 图像下采样系数
    quad_blur=0.0,        # 高斯模糊系数
    refine_edges=True     # 是否精细化边缘
)
detector = Detector(options)

# 读取图像
img = cv2.imread("test_image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测AprilTag
detections = detector.detect(gray)

# 显示检测结果
for detection in detections:
    print(f"标签家族: {detection.tag_family}, ID: {detection.tag_id}")
    print(f"位置: {detection.center}")
    print(f"角点: {detection.corners}")

Desenhar Resultados da Detecção

import numpy as np
from apriltag import draw_detection_results

# 相机内参矩阵和畸变系数
K = np.array([[800, 0, 320], [0, 800, 240], [0, 0, 1]], dtype=np.float32)
D = np.zeros((4, 1), dtype=np.float32)

# 绘制检测结果
result_img = draw_detection_results(img, detections, K, D, tag_size=0.1)

# 显示结果
cv2.imshow("AprilTag检测", result_img)
cv2.waitKey(0)

Executar Script de Teste

Um script de teste simples é fornecido para validar a funcionalidade de detecção de AprilTag:

python test_apriltag.py

Isso abrirá a câmera padrão do computador e detectará AprilTags em tempo real. Pressione "q" para sair.

Famílias de Tags Suportadas

A biblioteca pupil-apriltags suporta as seguintes famílias de tags:

  • tag36h11 (padrão)
  • tag25h9
  • tag16h5
  • tagCircle21h7
  • tagCircle49h12
  • tagStandard41h12
  • tagStandard52h13
  • tagCustom48h12

Observações

  • Para melhor desempenho, ajuste os parâmetros em DetectorOptions
  • Em dispositivos com recursos limitados, considere aumentar o parâmetro quad_decimate para reduzir a complexidade computacional
  • Certifique-se de que o tamanho das tags AprilTag corresponda ao parâmetro tag_size no código
  • O desenho dos eixos 3D requer parâmetros precisos da câmera

Características Principais

  • Suporte a detecção em tempo real de AprilTag com câmeras USB
  • Cálculo e exibição da pose 3D (posição e orientação) das tags
  • Suporte para salvar imagens originais e marcadas
  • Configuração personalizável e parâmetros de câmera
  • Inclui ferramenta completa de calibração de câmera
  • Versão independente em Python puro, sem dependência do ROS

Passos de Instalação

1. Instalar a Biblioteca C do AprilTag

A biblioteca C do AprilTag é obrigatória. Siga estes passos para instalar:

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install -y libapriltag-dev

Windows:

Usuários do Windows precisam compilar manualmente ou baixar binários pré-compilados, garantindo que apriltag.dll esteja no PATH do sistema ou no diretório atual.

2. Instalar Dependências Python

pip install -r requirements.txt  -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
pip install pupil-apriltags -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

Instruções de Uso

Início Rápido (Recomendado)

A forma mais simples de uso é executar a ferramenta integrada, que fornece um menu interativo para guiá-lo por todas as etapas:

python apriltag_tool.py

Esta ferramenta oferece opções de menu:

  1. Gerar tabuleiro de calibração
  2. Calibrar câmera
  3. Detecção de AprilTag
  4. Visualizar documentação de ajuda

Basta seguir as instruções do menu para completar todo o processo.

Calibração da Câmera

Antes de usar a detecção de AprilTag, recomenda-se calibrar a câmera para obter parâmetros precisos:

# 首先生成棋盘格标定板
python create_chessboard.py --size 9x6 --square 100 --output chessboard.png --dpi 300

# 打印棋盘格并测量实际方格大小,然后进行标定
python camera_calibration.py --size 9x6 --square 0.025 --output config/camera/HSK_200W53_1080P.yaml

Explicação dos parâmetros:

Ferramenta de Geração de Tabuleiro (create_chessboard.py):

  • --size: Número de cantos internos do tabuleiro, largura x altura (padrão: 9x6)
  • --square: Tamanho do quadrado, em pixels (padrão: 100)
  • --output: Caminho do arquivo de saída (padrão: chessboard.png)
  • --dpi: DPI da imagem de saída (padrão: 300), afeta o tamanho de impressão

Programa de Calibração da Câmera (camera_calibration.py):

  • --size: Número de cantos internos do tabuleiro, largura x altura (padrão: 9x6)
  • --square: Tamanho do quadrado do tabuleiro, em metros (padrão: 0.025)
  • --output: Caminho do arquivo de saída (padrão: config/camera/HSK_200W53_1080P.yaml)
  • --camera: ID do dispositivo da câmera (padrão: 0)
  • --width: Largura de captura da câmera (padrão: 1280)
  • --height: Altura de captura da câmera (padrão: 720)
  • --samples: Número de amostras necessárias para calibração (padrão: 20)
  • --preview: Visualizar efeito de correção após a calibração

Processo de calibração:

  1. Gere e imprima o tabuleiro de calibração
  2. Meça o tamanho real dos quadrados (em metros)
  3. Execute o programa de calibração, posicione o tabuleiro diante da câmera e colete amostras de diferentes ângulos
  4. O programa detectará automaticamente o tabuleiro e coletará amostras, ou pressione 's' para salvar manualmente o frame atual
  5. Após coletar amostras suficientes, o programa calculará automaticamente os parâmetros da câmera e os salvará no arquivo especificado

Detecção de AprilTag

Após a calibração, execute o programa de detecção de AprilTag:

python apriltag_detector.py

Uso Avançado

python apriltag_detector.py [配置文件路径] --camera 相机ID --width 宽度 --height 高度 --camera_info 相机参数文件

Explicação dos parâmetros:

  • Caminho do arquivo de configuração: Caminho do arquivo de configuração do AprilTag (padrão: config/vision/tags_36h11_all.json)
  • --camera: ID do dispositivo da câmera (padrão: 0)
  • --camera_info: Caminho do arquivo de parâmetros intrínsecos da câmera (padrão: config/camera/HSK_200W53_1080P.yaml)
  • --width: Largura de captura da câmera (padrão: 1280)
  • --height: Altura de captura da câmera (padrão: 720)

Controles por Teclado

  • q: Sair do programa

Explicação do Arquivo de Configuração

Todas as configurações do sistema podem ser definidas no arquivo config/vision/table_setup.json:

{
    "AprilTagConfig": {
        "family": "tag36h11",      // 标签家族
        "size": 0.05,              // 标签物理尺寸(单位:米)
        "threads": 2,              // 处理线程数
        "max_hamming": 0,          // 最大汉明距离
        "z_up": true,              // Z轴朝上
        "decimate": 1.0,           // 图像下采样系数
        "blur": 0.8,               // 模糊系数
        "refine_edges": 1,         // 是否精细化边缘
        "debug": 0                 // 是否打开调试
    },

    "Camera": {
        "device_id": 0,            // 相机设备ID
        "width": 1280,             // 相机宽度分辨率
        "height": 720,             // 相机高度分辨率
        "camera_info_path": "config/camera/HSK_200W53_1080P.yaml"  // 相机标定参数文件
    },

    "Archive": {
        "enable": true,            // 是否启用数据存档
        "preview": true,           // 是否显示预览窗口
        "save_raw": false,         // 是否保存原始图像
        "save_pred": false,        // 是否保存预测图像
        "path": "./data/table_tracking"  // 数据保存路径
    },

    "TableConfig": {
        "reference_tags": [0, 1, 2, 3],      // 参考标签ID列表
        "moving_tags": [4, 5, 6],            // 移动标签ID列表
        "require_initialization": true,       // 是否需要初始化
        "tag_positions": {                    // 预设标签位置(如果有)
            "0": [0.0, 0.0, 0.0],
            "1": [0.5, 0.0, 0.0],
            "2": [0.5, 0.5, 0.0],
            "3": [0.0, 0.5, 0.0]
        }
    }
}

Através da modificação do arquivo de configuração, é possível:

  1. Configurar parâmetros do detector AprilTag
  2. Definir parâmetros da câmera (ID do dispositivo, resolução, arquivo de parâmetros)
  3. Configurar opções de arquivamento de dados
  4. Personalizar IDs de tags de referência e tags móveis
  5. Controlar se a inicialização é necessária (defina require_initialization como false para pular a etapa de inicialização)
  6. Pré-definir informações de posição das tags

Método de Uso

Muito simples, basta um comando para iniciar o sistema:

python table_tracking.py

Se necessário usar um arquivo de configuração personalizado:

python table_tracking.py --config 自定义配置文件路径

Após iniciar o sistema, pressione 'i' para acionar manualmente o processo de inicialização a qualquer momento.

Perguntas Frequentes

  1. Biblioteca apriltag não encontrada

    Certifique-se de que a biblioteca apriltag está instalada corretamente e que os arquivos da biblioteca podem ser encontrados no sistema.

  2. Câmera não consegue abrir

    Verifique se o ID do dispositivo da câmera está correto e se a câmera não está sendo usada por outro programa.

  3. Resultados de detecção imprecisos

    Certifique-se de que sua câmera está calibrada corretamente e que o tamanho das tags no arquivo de configuração está correto.

Explicação da Estrutura de Arquivos

apriltag_standalone/
├── apriltag.py              # AprilTag检测库核心代码
├── apriltag_detector.py     # AprilTag检测主程序
├── apriltag_tool.py         # 集成工具启动菜单
├── camera_calibration.py    # 相机标定程序
├── create_chessboard.py     # 棋盘格生成工具
├── configs.py               # 配置文件处理
├── config/                  # 配置目录
│   ├── camera/              # 相机配置
│   │   └── HSK_200W53_1080P.yaml  # 相机参数
│   └── vision/              # 视觉配置
│       └── tags_36h11_all.json # AprilTag配置
├── README.md                # 说明文档
└── requirements.txt         # Python依赖

Notas Técnicas

Este projeto é uma versão independente portada do pacote ROS AprilTag, removendo dependências do ROS mas mantendo as funcionalidades principais. Utiliza as seguintes tecnologias:

  • OpenCV: Processamento de imagem, calibração de câmera e estimativa de pose
  • Biblioteca C AprilTag: Detecção de tags
  • SciPy: Conversão de matrizes de rotação e quatérnios

Licença

Este projeto está licenciado sob a licença MIT

Explicação de Novas Funcionalidades

Rastreamento Múltiplo de Tags e Tratamento de Oclusão

O sistema agora suporta as seguintes novas funcionalidades:

  1. Inicialização por Foto: Após iniciar, o sistema fará automaticamente uma foto de inicialização, registrando a relação de posição das tags, incluindo:

    • Posição das tags de referência fixas (ID 0-3)
    • Relação de posição entre múltiplas tags móveis (IDs padrão 4,5,6)
  2. Tratamento de Oclusão: Após inicialização, mesmo que algumas tags estejam ocluídas:

    • Se tags de referência estiverem ocluídas, o sistema pode usar outras tags de referência visíveis para estimar a posição das tags ocluídas
    • Se tags móveis estiverem ocluídas, o sistema pode estimar sua posição através de outras tags móveis visíveis
  3. Rastreamento Múltiplo de Tags: Suporte para rastrear múltiplas tags móveis simultaneamente, padrão para IDs 4,5,6

    • Se a posição relativa entre tags móveis for fixa, basta uma estar visível para estimar a posição das outras
    • IDs de tags móveis podem ser personalizados no arquivo de configuração

Explicação do Arquivo de Configuração

Todas as configurações do sistema podem ser definidas no arquivo config/vision/table_setup.json:

{
    "TableConfig": {
        "reference_tags": [0, 1, 2, 3],      // 参考标签ID列表
        "moving_tags": [4, 5, 6],            // 移动标签ID列表
        "require_initialization": true,       // 是否需要初始化
        "tag_positions": {                    // 预设标签位置(如果有)
            "0": [0.0, 0.0, 0.0],
            "1": [0.5, 0.0, 0.0],
            "2": [0.5, 0.5, 0.0],
            "3": [0.0, 0.5, 0.0]
        }
    }
}

Através da modificação do arquivo de configuração, é possível:

  1. Personalizar IDs de tags de referência e tags móveis
  2. Controlar se a inicialização é necessária (defina require_initialization como false para pular a etapa de inicialização)
  3. Pré-definir informações de posição das tags

Método de Uso

  1. Inicie o sistema com configuração padrão:

    python table_tracking.py
    
  2. Inicie o sistema com arquivo de configuração personalizado:

    python table_tracking.py --config caminho_do_arquivo_personalizado
    
  3. Inicialização manual: Pressione 'i' durante a execução do sistema

Requisitos de Execução

Certifique-se de que todas as tags estejam visíveis durante a inicialização, o sistema registrará a relação de posição entre elas. Após inicialização, mesmo com oclusão parcial, o sistema conseguirá estimar corretamente a posição de todas as tags.