Visão 3D
Visão geral
Visão 3D é a parte da visão computacional voltada a recuperar, representar e raciocinar sobre a estrutura 3D do mundo a partir de dados de sensores. Diferentemente das tarefas “clássicas” de visão 2D (classificação/detecção/segmentação; veja Tarefas Centrais), a visão 3D precisa lidar com geometria: escala, ponto de vista, oclusão, movimento de câmera e o fato de que uma imagem 2D descarta a profundidade.
A visão 3D aparece em muitos sistemas práticos:
- Robótica: navegação, desvio de obstáculos, manipulação, mapeamento (localização e mapeamento simultâneos (SLAM)).
- Direção autônoma: fusão LiDAR/câmera, detecção de objetos 3D, estimativa de espaço livre.
- AR/VR: malhagem de cena, tratamento de oclusão, relocalização.
- Criação de conteúdo: fotogrametria, “captura NeRF”, ativos 3D para jogos/filmes.
- Industrial/médico: inspeção, metrologia, navegação cirúrgica.
Um pipeline de visão 3D normalmente envolve:
- Sensoriamento (múltiplas imagens, estéreo, LiDAR, RGB-D etc.)
- Estimativa de profundidade e/ou movimento de câmera
- Reconstrução de uma representação 3D (pontos/voxels/malhas/campos neurais)
- Uso dessa representação em tarefas posteriores (renderização, planejamento, medição)
Fundamentos geométricos (a parte do “por que 3D é difícil”)
O modelo de câmera pinhole
A maior parte da visão 3D começa com um modelo de câmera que mapeia pontos 3D em pixels 2D:
- Um ponto 3D em coordenadas da câmera: ( \mathbf{X} = (X, Y, Z) )
- Sua projeção na imagem (idealizada):
( x = f_x \frac{X}{Z} + c_x,\quad y = f_y \frac{Y}{Z} + c_y )
Aqui:
- (f_x, f_y) são distâncias focais em unidades de pixel
- (c_x, c_y) é o ponto principal (algo como o centro da imagem)
- (Z) é a profundidade (distância ao longo do eixo para frente da câmera)
O mapeamento é muitos-para-um: infinitos pontos 3D ao longo de um raio projetam no mesmo pixel. Portanto, recuperar 3D exige informação adicional (múltiplas vistas, movimento conhecido, priors, sensores ativos de profundidade ou pistas aprendidas).
Geometria multivista: restrições epipolares e triangulação
Com duas câmeras calibradas (ou uma câmera movida para duas poses), pixels correspondentes restringem o ponto 3D a estar na interseção de dois raios — isso é triangulação.
Uma simplificação chave é a geometria epipolar: um ponto em uma imagem deve estar sobre uma linha epipolar na outra, reduzindo a busca por correspondências de 2D para 1D (ao longo da linha). Em estéreo retificado, as linhas epipolares tornam-se linhas horizontais de varredura.
Disparidade e profundidade (estéreo)
Em estéreo retificado:
- Disparidade (d) é o deslocamento horizontal em pixels entre as imagens esquerda e direita.
- A profundidade é aproximadamente:
[ Z = \frac{f \cdot B}{d} ]
onde:
- (f) é a distância focal (pixels)
- (B) é a linha de base (baseline) (distância entre as câmeras)
- (d) é a disparidade (pixels)
Isso mostra imediatamente duas realidades práticas:
- A profundidade torna-se instável quando a disparidade é pequena (objetos distantes).
- Aumentar a linha de base melhora a precisão da profundidade, mas dificulta a correspondência (mais oclusão).
Modalidades de sensoriamento de profundidade
A visão 3D pode estimar profundidade passivamente (a partir de imagens) ou medi-la ativamente (usando luz/radiação emitida).
Métodos passivos
- Câmeras estéreo: estimam disparidade via correspondência.
- Estrutura a partir do Movimento (Structure-from-Motion, SfM): recupera poses de câmera + pontos 3D esparsos a partir de muitas imagens (geralmente não ordenadas).
- Estéreo Multivista (Multi-View Stereo, MVS): densifica o SfM em superfícies detalhadas.
Prós: sensores baratos, bom para cenas ricas em textura.
Contras: falha em superfícies sem textura/reflexivas, sensível a mudanças de iluminação.
Métodos ativos
- Luz estruturada (por exemplo, os primeiros Kinect): projeta um padrão conhecido e infere profundidade a partir da deformação.
- Câmeras de Tempo de Voo (Time-of-Flight, ToF): medem o atraso de fase/tempo da luz refletida.
- LiDAR: mede distâncias via pulsos de laser, produzindo profundidade esparsa, porém precisa.
Prós: funciona com pouca textura, pode ser preciso.
Contras: custo, consumo de energia, interferência, artefatos de múltiplos caminhos (multipath), esparsidade (LiDAR), limites de alcance em ambientes internos (alguns RGB-D).
Câmeras RGB-D
Sensores RGB-D fornecem cor + profundidade alinhadas (um mapa de profundidade por pixel). Isso simplifica muitas tarefas: segmentação + geometria, malhagem, oclusão em AR etc. Mas a profundidade ainda tem buracos/ruído e precisa de filtragem.
Estimativa de profundidade baseada em aprendizado
A estimativa moderna de profundidade frequentemente usa Redes Neurais, incluindo CNNs e transformadores de visão (veja Arquitetura Transformer), para prever profundidade a partir de imagens.
Profundidade estéreo com redes profundas
Um pipeline estéreo comum:
- Extrair características das imagens esquerda/direita
- Construir um volume de custo (cost volume) sobre disparidades candidatas
- Regularizar o volume de custo (CNN 3D / transformador)
- Regressar a disparidade (soft-argmin) e converter para profundidade
Por que o aprendizado ajuda: o estéreo tradicional (block matching, SGM) tem dificuldade com padrões repetitivos, estruturas finas e baixa textura. Métodos aprendidos podem explorar semântica e contexto global.
Estimativa de profundidade monocular (imagem única)
A partir de uma única imagem, a profundidade não é determinada de forma única: muitas cenas 3D podem produzir a mesma imagem 2D. Assim, modelos monoculares dependem de:
- priors aprendidos (por exemplo, “o céu está longe”, “pessoas têm ~1,7m de altura”)
- estatísticas do conjunto de dados
- às vezes, restrições adicionais do treinamento
Duas configurações comuns de treinamento:
- Supervisionado: treinar com profundidade ground-truth (de LiDAR ou RGB-D).
- Auto-supervisionado (self-supervised) (uma grande tendência): treinar a partir de vídeos/pares estéreo usando reconstrução fotométrica (photometric reconstruction) — prever profundidade e movimento de câmera, então deformar (warp) um frame para outro e penalizar diferenças. Isso se conecta a Aprendizado Auto-Supervisionado.
Limitação principal: profundidade monocular frequentemente tem ambiguidade de escala (pode prever a profundidade até uma escala desconhecida, a menos que seja calibrada com movimento/linha de base conhecidos da câmera ou supervisão métrica).
Exemplo prático: mapa de profundidade → nuvem de pontos
Dado um mapa de profundidade e intrínsecos da câmera, você pode “desprojetar” (unproject) pixels em pontos 3D.
import numpy as np
def depth_to_point_cloud(depth, fx, fy, cx, cy, stride=1):
"""
depth: HxW array in meters (0 or NaN for invalid)
returns: Nx3 array of 3D points in camera coordinates
"""
H, W = depth.shape
ys, xs = np.mgrid[0:H:stride, 0:W:stride]
z = depth[ys, xs]
valid = np.isfinite(z) & (z > 0)
x = (xs[valid] - cx) * z[valid] / fx
y = (ys[valid] - cy) * z[valid] / fy
pts = np.stack([x, y, z[valid]], axis=1)
return pts
Esse passo simples é a ponte de “2D com profundidade” para muitas representações 3D (nuvens de pontos, grades de voxels, fusão TSDF).
Reconstrução 3D: de observações a um modelo 3D consistente
“Reconstrução” significa construir um modelo 3D unificado de uma cena/objeto a partir de múltiplas observações parciais.
Pipeline clássico: SfM + MVS (fotogrametria)
Uma abordagem comum usada em ferramentas como COLMAP:
- Detecção e correspondência de características (por exemplo, características do tipo SIFT, correspondedores aprendidos)
- Estimativa de poses de câmera (bundle adjustment otimiza poses e pontos 3D)
- Nuvem de pontos esparsa (características correspondidas trianguladas)
- Reconstrução densa (MVS) (mapas de profundidade por vista e, depois, fusão)
- Malhagem + texturização (transformar pontos em superfícies)
Pontos fortes:
- Produz malhas de alta qualidade para cenas estáticas
- Funciona com imagens comuns (por exemplo, fotos de smartphone)
Pontos fracos:
- Tem dificuldade com objetos em movimento, superfícies reflexivas/transparentes, baixa textura
- Requer sobreposição suficiente e captura controlada
Fusão RGB-D (métodos volumétricos)
Com vídeo RGB-D, você pode fundir frames de profundidade em um modelo global usando poses de câmera conhecidas ou estimadas (frequentemente via SLAM).
Uma representação amplamente usada é uma TSDF (Função de Distância Assinada Truncada, Truncated Signed Distance Function):
- Cada voxel armazena a distância até a superfície mais próxima (com sinal: dentro/fora)
- As distâncias são truncadas a uma pequena banda ao redor das superfícies
- Múltiplas medições de profundidade são promediadas para redução de ruído
Em seguida, você extrai uma malha via Marching Cubes.
Essa abordagem é robusta e eficiente para escaneamento indoor (malhagem de cena em AR, mapeamento 3D), mas a resolução é limitada pelo tamanho do voxel e pela memória (embora estruturas esparsas de voxels ajudem).
SLAM e mapeamento
Localização e Mapeamento Simultâneos (SLAM) estima:
- trajetória da câmera (poses ao longo do tempo)
- um mapa (pontos esparsos, profundidade densa ou superfícies implícitas)
Sistemas modernos frequentemente combinam:
- alinhamento geométrico (ICP, alinhamento fotométrico)
- características/profundidade aprendidas
- fechamento de loop (loop closure) para consistência global
(Se sua wiki inclui uma página de SLAM, este tópico naturalmente se conecta a ela; SLAM é essencialmente “visão 3D + estimação”.)
Representações 3D centrais (e para que elas servem)
Escolher uma representação é uma decisão importante de projeto. Tarefas diferentes preferem trade-offs distintos em memória, velocidade de renderização, edição e facilidade para aprendizado.
Nuvens de pontos
- O que: conjunto não ordenado de pontos 3D (opcionalmente com cor/normais)
- Prós: simples, natural para LiDAR, fácil de acumular
- Contras: sem conectividade explícita de superfície; renderização/malhagem exige etapas extras
Comum em robótica e direção autônoma.
Voxels (grades de ocupação)
- O que: grade 3D que armazena ocupação/densidade/características
- Prós: estrutura regular funciona bem com CNNs 3D
- Contras: memória escala de forma cúbica (alta resolução é cara)
Estruturas de dados esparsas (octrees, grades esparsas de voxels) mitigam o custo.
Malhas
- O que: vértices + arestas + faces (geralmente triângulos), representando superfícies
- Prós: renderização eficiente; superfícies explícitas; padrão em pipelines de computação gráfica
- Contras: mudanças de topologia são difíceis; aprender a produzir malhas limpas é complicado
Malhas ainda são o “produto final” para muitas aplicações (CAD, jogos), mesmo que etapas intermediárias usem campos neurais.
Campos implícitos (ocupação e SDF)
Representações implícitas definem uma função contínua (f(\mathbf{x})) no espaço 3D:
- Rede de ocupação (occupancy network): (f(\mathbf{x}) \in [0,1]) indica dentro/fora
- Função de Distância Assinada (Signed Distance Function, SDF): (f(\mathbf{x})) é a distância até a superfície (negativa por dentro, positiva por fora)
Prós:
- Contínua, independente de resolução
- Se ajusta bem a MLPs (“superfícies implícitas neurais”)
- Pode representar detalhes finos sem grades densas
Contras:
- Extrair uma malha exige amostragem + marching cubes
- Consultas podem ser lentas a menos que sejam aceleradas
Essas ideias se conectam naturalmente a Campos de Radiância Neurais (Neural Radiance Fields, NeRFs), que adicionam aparência dependente da vista.
NeRFs (nível alto): representações neurais de cena para síntese de novas vistas
Campos de Radiância Neurais (Neural Radiance Fields, NeRFs) modelam uma cena como uma função contínua que mapeia:
- posição 3D (\mathbf{x})
- direção de visão (\mathbf{d})
para:
- densidade (quanta matéria há naquele ponto)
- cor (radiância emitida na direção (\mathbf{d}))
Um NeRF é tipicamente implementado como uma MLP (com codificação posicional) treinada para que, ao renderizar a cena a partir de poses de câmera conhecidas, reproduza as imagens de treinamento.
A ideia-chave: renderização volumétrica diferenciável ao longo de raios
Para cada pixel, lance um raio na cena, amostre pontos ao longo dele e integre a cor usando a densidade prevista. Conceitualmente:
- Para um raio (r(t) = \mathbf{o} + t\mathbf{v}), amostre (t_1, \dots, t_N)
- Consulte a rede: ((\sigma_i, \mathbf{c}_i) = F(\mathbf{x}_i, \mathbf{d}))
- Combine amostras com pesos de renderização volumétrica (transmitância)
Você pode pensar nisso como uma “acumulação” suave de cores, em que a densidade determina a opacidade.
Um esboço mínimo de pseudocódigo:
for each pixel ray:
colors, densities = [], []
for t in samples_along_ray:
x = o + t * v
sigma, c = NeRF(x, dir)
append(sigma, c)
pixel_color = volume_render(colors, densities, deltas)
Como a renderização é diferenciável, você pode otimizar os parâmetros do NeRF com retropropagação (backpropagation) padrão (veja Retropropagação) para minimizar a perda de reconstrução de imagem.
Para que NeRFs são bons
- Síntese fotorealista de novas vistas a partir de um conjunto de imagens com poses
- Reconstrução de alta qualidade da aparência, incluindo efeitos dependentes da vista
Limitações práticas
- Requer muitas imagens com poses conhecidas/estimadas (embora a estimativa de pose possa ser aprendida)
- O treinamento pode ser lento (melhorado por acelerações como grades hash multirresolução)
- Cenas dinâmicas, especularidades e ambientes externos grandes adicionam complexidade
- NeRFs não são automaticamente “tipo malha”; extrair ativos editáveis pode não ser trivial
Extensões comuns (conceituais)
- NeRFs acelerados: codificações por grade hash e amostragem otimizada em GPU para treinamento/renderização rápidos
- Mip-NeRF / anti-aliasing: melhor tratamento de diferentes pegadas de pixel
- NeRFs dinâmicos (4D): modelar cenas que variam no tempo
- Modelos de relighting/materiais: separar iluminação de geometria/BRDF (mais difícil, mas valioso para edição)
Representações 3D emergentes e tendências
Os últimos anos viram uma rápida evolução além de MLPs “NeRF puro”. Algumas direções importantes:
Splatting Gaussiano 3D (3D Gaussian Splatting) (explícito, renderização rápida)
Em vez de consultar uma MLP muitas vezes por pixel, represente a cena como um conjunto de Gaussianas 3D (elipsoides) com parâmetros aprendidos:
- posição, covariância (forma/orientação)
- opacidade (semelhante à densidade)
- cor (frequentemente com componentes dependentes da vista)
A renderização torna-se uma operação rápida e diferenciável de splatting/composição. Na prática, isso pode oferecer:
- treinamento muito rápido
- renderização quase em tempo real
- alta qualidade visual
Trade-off: a representação pode ser menos compacta ou mais difícil de editar geometricamente do que uma malha limpa, e a qualidade depende de como as Gaussianas são gerenciadas e regularizadas.
Representações híbridas (o melhor de vários mundos)
Sistemas combinam cada vez mais:
- geometria explícita (malhas/nuvens de pontos) para estrutura
- campos neurais para aparência, detalhes finos e dependência de vista
Isso é prático para AR/VR e robótica, onde você quer tanto:
- um mapa navegável e métrico
- renderização de alta qualidade para visualização
Grades esparsas e campos fatorados
Para escalar para cenas grandes, muitas abordagens usam:
- grades esparsas de voxels armazenando características aprendidas
- fatoração de tensores (decomposições de baixo posto)
- estruturas hierárquicas para eficiência de memória
Esses métodos buscam manter consulta e renderização rápidas enquanto preservam detalhes.
3D generativo (texto/imagem → 3D)
Modelos generativos (frequentemente baseados em Modelos de Difusão) estão sendo adaptados ao 3D:
- gerar nuvens de pontos, voxels, malhas ou campos neurais
- produzir ativos 3D condicionados por prompts de texto ou imagens
- impor consistência multivista via perdas de renderização diferenciável
Essa área se conecta fortemente a sistemas multimodais (veja Multimodal (Modelos Visão-Linguagem)), porque a geração 3D condicionada por texto frequentemente aproveita priors visão-linguagem pré-treinados em grande escala.
Principais problemas em aberto:
- controlabilidade (forma, escala, topologia exatas)
- plausibilidade física e fechamento (watertightness)
- produzir malhas limpas e editáveis com UVs/materiais
Aplicações práticas e fluxos de trabalho de exemplo
Exemplo: escanear um cômodo para oclusão e medição em AR
Um workflow típico de “malha de cena” em AR pode:
- Usar um sensor RGB-D (ou modelo monocular de profundidade) para estimar profundidade a cada frame
- Rastrear a pose da câmera (odometria visual-inercial / SLAM)
- Fundir profundidade em uma TSDF ou mapa de surfels
- Extrair uma malha para oclusão (objetos virtuais escondidos atrás de objetos reais)
- Usar a malha/planos para medições (distância até a parede, dimensões do cômodo)
Isso destaca um tema recorrente: visão 3D frequentemente é um sistema, não um único modelo.
Exemplo: percepção para direção autônoma
Uma pilha (stack) de direção pode combinar:
- nuvens de pontos LiDAR (geometria precisa)
- imagens de câmera (semântica densa e textura)
- completamento de profundidade aprendido (preencher LiDAR esparso em profundidade densa)
- detecção e rastreamento de objetos 3D
A representação 3D pode ser:
- uma grade em vista de cima (bird’s-eye-view, BEV) de características aprendidas
- um mapa baseado em pontos
- um campo de ocupação para planejamento
Avaliação e armadilhas comuns
A avaliação em 3D é sutil: resultados dependem fortemente de convenções de coordenadas, escala, ruído do sensor e vieses do conjunto de dados. Boas práticas de avaliação importam (veja Avaliação para Visão).
Métricas de estimativa de profundidade
Métricas comuns de profundidade incluem:
- Abs Rel: erro relativo absoluto médio
- RMSE: raiz do erro quadrático médio
- Acurácia por limiar δ (δ-threshold accuracy): porcentagem de pixels onde
(\max(\hat{Z}/Z, Z/\hat{Z}) < \delta) (frequentemente δ = 1.25, 1.25², 1.25³)
Cuidados importantes:
- profundidade monocular pode precisar de alinhamento de escala para comparação justa
- pixels de profundidade ausentes devem ser mascarados de forma consistente
- bordas e estruturas finas afetam desproporcionalmente a qualidade percebida
Métricas de reconstrução 3D
Dependendo da representação:
- Distância de Chamfer (Chamfer Distance) (entre conjuntos de pontos)
- F-score em um limiar de distância (precisão/recall para superfícies)
- IoU para ocupação em voxels
- Para síntese de novas vistas: PSNR, SSIM, métricas perceptuais como LPIPS
Armadilhas:
- Um método pode “trapacear” produzindo vistas visualmente plausíveis, mas com geometria métrica incorreta.
- Limiares muito apertados podem punir pequeno drift de pose; limiares frouxos podem esconder erros grandes.
Ferramentas e conjuntos de dados (pontos de entrada práticos)
Ferramentas comuns:
- OpenCV: calibração, estéreo, utilitários de geometria
- COLMAP: reconstrução SfM/MVS
- Open3D: processamento de nuvem de pontos, ICP, malhagem, fusão TSDF
- Nerfstudio (e similares): pipelines de treinamento/avaliação de NeRF
Conjuntos de dados representativos (variam por tarefa):
- KITTI: direção, estéreo + LiDAR
- NYU Depth v2: RGB-D indoor
- ScanNet / Matterport3D: reconstrução indoor
- DTU / Tanks and Temples: benchmarks de reconstrução multivista
Resumo
A visão 3D fica na interseção de geometria, aprendizado e renderização:
- Profundidade pode ser medida (LiDAR/RGB-D) ou inferida (aprendizado estéreo/monocular).
- Reconstrução 3D funde múltiplas vistas em modelos coerentes de cena via SfM/MVS, fusão RGB-D ou abordagens aprendidas.
- Representações (pontos, voxels, malhas, campos implícitos) codificam diferentes trade-offs em precisão, eficiência e editabilidade.
- NeRFs introduziram uma formulação poderosa de campo neural para síntese fotorealista de vistas, e métodos mais novos (por exemplo, splatting Gaussiano, campos esparsos/híbridos) avançam em direção a desempenho em tempo real e melhor escalabilidade.
- Trabalhos emergentes em 3D generativo buscam criar ativos 3D editáveis a partir de texto/imagens, mas consistência e controle permanecem desafios ativos de pesquisa.
Se você está aprendendo visão 3D, um caminho produtivo é: geometria de câmera → estimativa de profundidade → nuvens de pontos/malhas → reconstrução multivista → campos neurais (NeRF) → representações 3D modernas eficientes e generativas.