Calibração de Câmera

O que é calibração de câmera e por que ela importa

Calibração de câmera é o processo de estimar os parâmetros de um modelo de câmera para que você consiga mapear com precisão entre:

  • Coordenadas 3D do mundo (metros em uma cena) e
  • Coordenadas 2D da imagem (pixels no sensor)

A calibração normalmente estima:

  • Intrínsecos: distâncias focais, ponto principal, skew (raro), tamanho da imagem e, às vezes, razão de aspecto do pixel
  • Distorção da lente: distorção radial e tangencial (e outros modelos de lente para lentes grande-angulares/olho de peixe)
  • Extrínsecos: a pose (pose) da câmera (rotação e translação) em relação a um sistema de coordenadas do mundo ou a um alvo de calibração

Uma calibração precisa é fundamental para a maior parte da visão 3D: triangulação, geometria multivista, SLAM/SfM, medição métrica e métodos neurais modernos como Renderização Neural e Splatting Gaussiano 3D. Uma calibração ruim degrada silenciosamente tudo a jusante: a profundidade fica enviesada, nuvens de pontos entortam, e reconstruções neurais “explicam” a má calibração inventando geometria deformada.

O modelo de câmera: de 3D para pixels

A maioria dos pipelines de calibração assume uma câmera pinhole (pinhole camera) mais um modelo de distorção (distortion model).

Intrínsecos (a matriz \(K\))

A matriz intrínseca (K) mapeia coordenadas da câmera para coordenadas de pixel (ignorando distorção):

[ K = \begin{bmatrix} f_x & s & c_x \ 0 & f_y & c_y \ 0 & 0 & 1 \end{bmatrix} ]

  • (f_x, f_y): distância focal em pixels (depende da distância focal e do passo de pixel do sensor)
  • ((c_x, c_y)): ponto principal (frequentemente perto do centro da imagem)
  • (s): skew (geralmente ~0 em câmeras modernas)

Extrínsecos (pose: \(R, t\))

Os extrínsecos transformam pontos das coordenadas do mundo para o referencial de coordenadas da câmera:

[ \mathbf{X}_c = R \mathbf{X}_w + t ]

  • (R \in SO(3)): matriz de rotação
  • (t \in \mathbb{R}^3): vetor de translação

Isso está intimamente relacionado à Estimativa de Pose: a calibração frequentemente estima a pose da câmera para cada imagem de calibração, enquanto a estimativa de pose normalmente assume que os intrínsecos já são conhecidos.

Projeção (pinhole)

Dado um ponto 3D em coordenadas da câmera ((X, Y, Z)), as coordenadas normalizadas no plano da imagem são:

[ x = X/Z,\quad y = Y/Z ]

Então, os pixels:

[ u = f_x x + c_x,\quad v = f_y y + c_y ]

Distorção (por que linhas retas curvam)

Lentes reais desviam raios. Um modelo comum é a distorção Brown–Conrady:

  • Distorção radial (barril/almofada): (k_1, k_2, k_3, ...)
  • Distorção tangencial (descentramento): (p_1, p_2)

Usando coordenadas normalizadas ((x, y)) com (r^2 = x^2 + y^2):

[ x_d = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1xy + p_2(r^2 + 2x^2) ] [ y_d = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1(r^2 + 2y^2) + 2p_2xy ]

Em seguida, aplique os intrínsecos a ((x_d, y_d)).

Nota prática: Para lentes muito grande-angulares, o modelo radial polinomial padrão pode ter dificuldade; modelos de olho de peixe (por exemplo, o módulo fisheye do OpenCV) frequentemente se comportam melhor.

O que “calibrar uma câmera” realmente resolve

Dadas observações de pontos 3D conhecidos (ou um padrão planar conhecido) e suas localizações 2D em pixels detectadas, a calibração estima:

  • (K) (intrínsecos)
  • coeficientes de distorção
  • pose por imagem ((R_i, t_i))

Para alvos planares (tabuleiros xadrez, Charuco), os pontos 3D são conhecidos no sistema de coordenadas do tabuleiro: ((X, Y, 0)) com o tamanho do quadrado em metros.

Configurações comuns de calibração

Calibração com tabuleiro xadrez (clássica)

Um tabuleiro xadrez (checkerboard) fornece uma grade de cantos com espaçamento conhecido. Você tira várias imagens do tabuleiro em diferentes posições e inclinações, detecta os cantos e otimiza os parâmetros.

Prós

  • Simples, amplamente suportado
  • Boa precisão quando os cantos estão nítidos e as imagens cobrem todo o campo de visão

Contras

  • A detecção de cantos pode falhar com desfoque, reflexos, baixa textura ou distorção forte
  • Tabuleiros puramente xadrez podem ser ambíguos sob padrões repetitivos em alguns pipelines de detecção

Dicas de captura

  • Use 15–30 imagens como ponto de partida (mais se você precisar de alta precisão)
  • Varie:
    • distância (perto e longe)
    • inclinação (pitch/yaw/roll)
    • posição do tabuleiro (cobrir cantos/bordas da imagem)
  • Evite que todas as imagens sejam fronto-paralelas; você precisa de variação de perspectiva para restringir os parâmetros.

Tabuleiros Charuco (híbrido ArUco + xadrez)

Um tabuleiro Charuco combina:

  • marcadores fiduciais ArUco (identificação robusta)
  • um tabuleiro de xadrez embutido para cantos subpixel

Prós

  • Mais robusto sob oclusão, vistas parciais e condições difíceis
  • Marcadores desambiguam quais cantos você está vendo
  • Muitas vezes melhor para pipelines automatizados de captura de dados

Contras

  • Configuração um pouco mais complexa (impressão, código de detecção)
  • Ainda sensível a desfoque de movimento e iluminação ruim

Charuco é uma recomendação comum para calibração prática em robótica e AR porque reduz “modos de falha silenciosos” (ordenação errada de cantos, detecções incorretas).

Calibração multi-câmera (estéreo / rig)

Para estéreo ou arranjos de câmeras você precisa de ambos:

  • intrínsecos/distorção individuais para cada câmera
  • extrínsecos relativos (relative extrinsics) entre câmeras (baseline, rotações)

Isso permite retificação, profundidade a partir de disparidade e geometria multivista consistente.

Em muitos pipelines, você calibra primeiro os intrínsecos de cada câmera e, depois, estima a pose relativa usando imagens sincronizadas do mesmo alvo.

“Auto-calibração” (a partir de cenas naturais)

Auto-calibração (self-calibration) estima intrínsecos e poses a partir de imagens sem um padrão de calibração conhecido, tipicamente usando:

  • correspondência de características + geometria epipolar
  • otimização no estilo estrutura-a-partir-de-movimento (SfM)

Isso é comum em:

  • pipelines de captura casual
  • SfM em larga escala (por exemplo, coleções de fotos)
  • reconstrução neural de cenas que otimiza conjuntamente parâmetros de câmera

Limitação importante: a auto-calibração pode ser mal condicionada sem restrições. Intrínsecos podem derivar, e há liberdades de gauge (gauge freedoms) (ambiguidade de escala, ambiguidade do referencial de coordenadas). Muitas vezes você precisa de priors ou conhecimento parcial (por exemplo, ponto principal fixo, razão de aspecto conhecida, faixa de distância focal conhecida).

A auto-calibração está intimamente relacionada ao Ajuste de Feixe, que é o otimizador de referência para refinar estrutura e parâmetros de câmera conjuntamente.

O objetivo de otimização: erro de reprojeção

A calibração geralmente é resolvida como mínimos quadrados não lineares (nonlinear least squares). A ideia central:

  1. Projete os pontos 3D conhecidos na imagem usando os parâmetros atuais.
  2. Compare as localizações de pixel projetadas com as localizações de pixel detectadas.
  3. Minimize a discrepância.

Para a imagem (i) e o ponto (j):

[ \min_{\theta} \sum_{i,j} \left| \mathbf{u}_{ij} - \pi(\mathbf{X}_j; K, d, R_i, t_i) \right|^2 ]

  • (\mathbf{u}_{ij}): localização 2D observada do canto
  • (\pi(\cdot)): função de projeção incluindo distorção
  • (\theta): todos os parâmetros desconhecidos
  • (d): coeficientes de distorção

Isso é o erro de reprojeção (reprojection error). A maioria das bibliotecas reporta o erro RMS de reprojeção em pixels.

Por que o ajuste de feixe aparece

Se você calibra a partir de um alvo planar, os pontos 3D são conhecidos e fixos. Se você calibra a partir de uma estrutura 3D desconhecida (auto-calibração / SfM), então os pontos 3D também são variáveis, e a otimização vira um Ajuste de Feixe completo: refinando câmeras e estrutura conjuntamente.

Por baixo dos panos, os solucionadores frequentemente usam Levenberg–Marquardt, Jacobianas esparsas e perdas robustas para lidar com outliers.

Exemplo prático: calibrando uma câmera pinhole com OpenCV (tabuleiro xadrez)

Abaixo está um fluxo de trabalho mínimo e típico em Python. Ele omite várias verificações, mas ilustra os passos centrais.

import glob
import cv2
import numpy as np

# Checkerboard inner corners (columns, rows)
pattern_size = (9, 6)
square_size = 0.024  # meters (24 mm)

# Prepare 3D points in the checkerboard coordinate system (Z=0 plane)
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
objp *= square_size

objpoints = []  # 3D points in board coordinates
imgpoints = []  # 2D points in pixels

images = sorted(glob.glob("calib_images/*.jpg"))

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 50, 1e-6)

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    ok, corners = cv2.findChessboardCorners(gray, pattern_size)
    if not ok:
        continue

    # Subpixel refinement improves accuracy significantly
    corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)

    objpoints.append(objp)
    imgpoints.append(corners)

# Calibrate
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None
)

print("RMS reprojection error:", ret)
print("K:\n", K)
print("dist:", dist.ravel())

O que observar

  • Erro RMS de reprojeção: uma ordem de grandeza em torno de 0,1–0,5 px pode ser alcançável em boas condições; >1 px sugere problemas (detecções ruins, desfoque, tamanho de quadrado errado, diversidade insuficiente de pontos de vista, modelo de distorção inadequado).
  • Verificação visual: remova a distorção (undistort) das imagens e confira se linhas retas parecem retas.

Removendo distorção de uma imagem

img = cv2.imread("test.jpg")
h, w = img.shape[:2]
newK, roi = cv2.getOptimalNewCameraMatrix(K, dist, (w, h), alpha=0.0)
undist = cv2.undistort(img, K, dist, None, newK)
cv2.imwrite("undistorted.jpg", undist)

alpha=0.0 recorta para pixels válidos; alpha=1.0 mantém todos os pixels, mas pode incluir regiões pretas.

Orientações práticas: obtendo dados de calibração de alta qualidade

A qualidade da calibração é dominada pela qualidade dos dados. Boas práticas comuns:

  • Maximize a cobertura da imagem: cantos próximos aos quatro cantos da imagem são os mais importantes para estimar distorção.
  • Varie profundidade e inclinação: ajuda a separar distância focal de distância e reduz degenerescência.
  • Evite desfoque de movimento: o desfoque enviesará a localização dos cantos.
  • Use boa iluminação: iluminação consistente melhora a precisão subpixel.
  • Trave as configurações da câmera:
    • desative o autofoco se ele alterar levemente a distância focal
    • desative auto-zoom / estabilização digital
    • fixe a resolução (intrínsecos dependem da resolução)
  • Use um alvo plano: papel ondulado introduz erro sistemático. Monte em uma superfície rígida, se possível.
  • Meça o tamanho do quadrado com precisão se você precisar de escala métrica.

Avaliando a qualidade da calibração (além do “erro RMS”)

O erro RMS de reprojeção é necessário, mas não suficiente. Considere:

  • Resíduos por imagem e por ponto: algumas poucas vistas ruins podem contaminar os resultados.
  • Padrões espaciais de resíduos:
    • resíduos crescendo em direção aos cantos da imagem podem indicar modelo de distorção errado
    • resíduos assimétricos podem indicar ponto principal incorreto ou distorção tangencial
  • Estabilidade entre execuções: recalibre com subconjuntos diferentes de imagens; os resultados devem ser consistentes.
  • Validação a jusante:
    • estéreo: verificar alinhamento epipolar após retificação
    • AR: a sobreposição deve “grudar” sem flutuar
    • reconstrução: arestas retas no mundo devem permanecer retas em 3D

Regra prática: se a calibração for usada para medição ou reconstrução de alta fidelidade, trate-a como um experimento—repita, quantifique a incerteza e valide com verificações independentes.

Variantes de calibração e tópicos avançados

Calibrando lentes olho de peixe e grande-angulares

Para lentes muito abertas, perspectiva + distorção polinomial pode ficar instável. Modelos de olho de peixe frequentemente parametrizam a distorção em função do ângulo em relação ao eixo óptico.

Se você observar:

  • resíduos grandes nas bordas
  • remoção de distorção ruim perto dos cantos
  • instabilidade nos (k_i) estimados

…tente um modelo específico para olho de peixe e garanta muitas amostras perto da periferia da imagem.

Obturador rolante e efeitos temporais

Muitas câmeras de celular usam obturador rolante (rolling shutter), em que linhas diferentes são expostas em momentos diferentes. Para movimento rápido ou captura na mão, isso viola a suposição estática do pinhole e pode aparecer como:

  • erros de reprojeção inconsistentes
  • “tremor” na estimativa de pose
  • geometria distorcida em reconstruções

Mitigações incluem obturador mais rápido, estabilização via fusão com IMU, ou modelos explícitos de obturador rolante (mais complexos).

Mudanças de zoom/foco e “intrínsecos dinâmicos”

Mudar foco ou zoom muda os intrínsecos (especialmente a distância focal e, às vezes, o ponto principal). Se sua aplicação muda o foco durante a captura:

  • calibre na mesma distância de foco, ou
  • modele os intrínsecos variando por quadro (mais difícil), ou
  • trave o foco para a sequência.

Calibração mão–olho (robótica)

Em robótica, muitas vezes você precisa da transformação entre uma câmera e o efetuador final do robô (“eye-in-hand”) ou a base do robô (“eye-to-hand”). Isso vai além de intrínsecos/extrínsecos clássicos e estima uma transformação rígida entre referenciais de coordenadas, frequentemente usando observações repetidas de um alvo enquanto move o robô.

Calibração multi-sensor (câmera–IMU / LiDAR)

Sistemas modernos fundem câmera com IMU/LiDAR. A calibração extrínseca entre sensores é crítica; pequenos erros angulares levam a deriva significativa de reprojeção. Essas calibrações frequentemente combinam restrições geométricas com sincronização temporal.

Auto-calibração e pipelines baseados em aprendizado

A auto-calibração é cada vez mais comum em fluxos de trabalho de ML/IA, especialmente para reconstrução neural e grandes coleções de fotos da internet.

Estilo Estrutura-a-partir-de-Movimento (SfM)

Pipeline típico:

  1. detectar características
  2. casar características
  3. estimar poses relativas (matriz essencial/fundamental)
  4. triangular pontos
  5. executar Ajuste de Feixe para refinar tudo

Mesmo quando os intrínsecos são parcialmente conhecidos (por exemplo, distância focal do EXIF), o ajuste de feixe frequentemente os refina.

Renderização neural e otimização conjunta de câmeras

Em métodos de Renderização Neural (por exemplo, no estilo NeRF), os parâmetros de câmera podem ser:

  • assumidos como conhecidos (de COLMAP ou calibração)
  • otimizados conjuntamente com a representação da cena
  • regularizados com priors (por exemplo, pequenas correções de pose, intrínsecos fixos)

Isso interage com formação de imagem diferenciável: parâmetros de câmera podem ser otimizados via gradientes de modo semelhante aos parâmetros da cena, conectando-se à Renderização Diferenciável.

Por que boa calibração ainda importa na renderização neural

  • Métodos neurais podem “absorver” erros de calibração deformando a geometria ou campos de densidade.
  • Isso ainda pode produzir renders visualmente agradáveis, mas gera:
    • geometria incorreta
    • baixa consistência entre vistas
    • menor capacidade de editar/reluminar
    • pior generalização para trajetórias de câmera novas

Na prática, uma calibração inicial de alta qualidade frequentemente melhora a convergência e evita mínimos locais em que o modelo ajusta as imagens com a câmera errada.

Modos de falha comuns e como corrigí-los

  • Erro de reprojeção alto em algumas imagens

    • Causa: quadros borrados, detecção parcial, reflexos
    • Correção: remover imagens outliers; garantir detecção estável; melhorar iluminação
  • Bom erro RMS, mas remoção de distorção ruim

    • Causa: cobertura insuficiente perto das bordas; modelo de distorção errado
    • Correção: capturar mais vistas próximas às bordas do quadro; tentar um modelo de distorção diferente
  • Distâncias focais muito diferentes entre execuções

    • Causa: diversidade limitada de pontos de vista; degenerescência planar; mudanças de autofoco
    • Correção: adicionar vistas inclinadas/próximas; travar o foco; aumentar o tamanho do conjunto de dados
  • A escala está errada

    • Causa: tamanho de quadrado errado
    • Correção: medir o alvo impresso com precisão; considerar escala da impressora
  • A profundidade estéreo está enviesada

    • Causa: extrínsecos relativos ruins; desalinhamento temporal; incompatibilidade do modelo de lente
    • Correção: calibrar o estéreo conjuntamente; garantir captura sincronizada; verificar retificação

Aplicações: onde a calibração aparece na visão 3D

  • Reconstrução 3D e SfM: a precisão métrica depende de intrínsecos/distorção corretos.
  • AR/VR: sobreposições estáveis exigem intrínsecos precisos e pose de baixa latência; má calibração causa “flutuação.”
  • Robótica: preensão e navegação exigem geometria consistente entre quadros e sensores.
  • Representações neurais de cena: NeRF/INRs e métodos de splatting dependem de raios precisos:
  • Medição / metrologia: pequenos vieses no nível de pixel se traduzem em erro métrico significativo à distância.

Principais conclusões

  • A calibração estima intrínsecos, extrínsecos e distorção para mapear entre 3D e pixels.
  • O objetivo central é minimizar o erro de reprojeção, frequentemente via mínimos quadrados não lineares; pipelines completos comumente usam Ajuste de Feixe.
  • Tabuleiros xadrez e tabuleiros Charuco são padrões práticos; Charuco costuma ser mais robusto em condições reais.
  • A qualidade da calibração afeta fortemente tarefas 3D a jusante e reconstrução neural moderna—métodos neurais podem esconder visualmente uma má calibração, mas ainda assim aprender geometria errada.
  • Os maiores ganhos geralmente vêm de melhor captura de dados: pontos de vista diversos, boa cobertura de bordas, imagens nítidas, configurações estáveis da câmera e um alvo rígido.