Contents — find the section you need
Suponha que uma imagem capturada por uma câmera possua diversos pontos 3D conhecidos em um mapa, correspondentes a pontos na imagem. O problema de encontrar a posição da câmera e sua direção de apontamento é conhecido como PnP (Perspectiva-n-Ponto). Ele é amplamente utilizado em rastreamento de mapas por SLAM visual, sobreposição de objetos virtuais em RA, calibração olho-mão para robôs e estimativa de pose para câmeras de levantamento topográfico.
Resumo de 30 segundos
-
A entrada consiste na matriz intrínseca da câmera K, pontos 3D conhecidos \mathbf X_i e seus pontos correspondentes na imagem \mathbf u_i. A saída consiste em uma rotação R e uma translação t.
-
O problema minimiza o erro de reprojeção da equação de projeção \mathbf u_i\sim K(R\mathbf X_i+t). Com 3 pontos, o PnP fornece soluções candidatas; Com 4 ou mais pontos, a redundância permite detectar outliers.
- O EPnP expressa cada ponto como uma combinação linear de 4 pontos de controle virtuais, resolvendo rapidamente para muitos pontos. Uma otimização não linear final, como Levenberg-Marquardt, refina o resultado.
-
Se outliers forem misturados às correspondências, toda a estimativa de pose pode colapsar; portanto, ela é verificada com RANSAC-PnP, verificações de profundidade positiva e consistência quadro a quadro.
-
Degeneração e divergência são comuns quando os pontos são quase coplanares, a paralaxe é pequena, os parâmetros intrínsecos estão incorretos ou há obturador rolante ou objetos dinâmicos na cena.
1. O Modelo de Projeção
Figura 1 — IDs correspondentes definem correspondências 3D–2D. O PnP forma uma hipótese de pose, rejeita outliers por resíduo de reprojeção e refina R,t, que mapeia coordenadas do mundo em coordenadas da câmera.
Considere um ponto no sistema de coordenadas da câmera como \mathbf X_c=R\mathbf X_w+t. No modelo pinhole, as coordenadas de imagem normalizadas são
e as coordenadas de pixel são obtidas por meio da matriz intrínseca
como \mathbf u\sim K\mathbf X_c . R\in SO(3) é a rotação e t a translação. Se houver distorção da lente, a correção da distorção é necessária antes e depois da projeção.
As incógnitas são os 6 graus de liberdade, sendo 3 rotacionais e 3 translacionais. Dadas as correspondências n entre os pontos 3D \mathbf X_i e as observações \mathbf u_i , o erro de reprojeção
é minimizado. \pi é a divisão de perspectiva e \rho é uma perda robusta, como a de Huber.
Não confunda a transformação com a posição da câmera
O solvePnP do OpenCV retorna rvec, tvec para a transformação que mapeia pontos do objeto/mundo para o sistema de coordenadas da câmera. Para obter o centro da câmera em coordenadas do mundo, use \mathbf C_w=-R^Tt; para uma pose da câmera, inverta T_{cw} para obter T_{wc}. Tratar tvec como a posição da câmera no mundo é um erro comum. Evite também aplicar distorção duas vezes quando os pontos da imagem de entrada já tiverem sido corrigidos.
2. P3P, AP3P e EPnP
P3P (Perspectiva de 3 Pontos), que recupera a distância do centro da câmera usando os ângulos da imagem de 3 pontos e as distâncias entre os pontos 3D, possui até 4 soluções. A correta é selecionada verificando-se com um 4º ponto ou com a pose conhecida do mapa. AP3P é uma variante rápida que reorganiza a solução algebricamente.
Quando há muitos O método EPnP (Efficient PnP) expressa cada ponto 3D como uma soma ponderada de 4 pontos de controle virtuais.
As coordenadas da câmera dos pontos de controle são encontradas a partir de equações lineares, e a rotação e a translação são recuperadas a partir delas. Como seu custo computacional é quase linear em relação ao número de pontos, ele é adequado para construir uma pose inicial a partir dos muitos pontos de referência do SLAM. Após a solução inicial, o erro de reprojeção é refinado iterativamente com Levenberg-Marquardt.
3. RANSAC-PnP
As correspondências entre pontos de referência se misturam com padrões de aparência semelhante, objetos em movimento e IDs de mapa incorretos. A abordagem padrão é o RANSAC: construir uma pose provisória a partir de um conjunto mínimo de pontos, reprojetar cada correspondência e contar quantos pontos internos estão dentro de um limite. O número de iterações N necessárias, dada a taxa de outliers \epsilon, mínimo O tamanho da amostra s e a probabilidade de sucesso p são determinados por
Como o número necessário de iterações aumenta acentuadamente com a taxa de outliers, reduza \epsilon previamente usando um teste de proporção de pontos de características, dispersão baseada em grade ou uma máscara de objeto dinâmico. O solvePnPRansac do OpenCV é usado especificando explicitamente a contagem de pontos, flags (EPNP, P3P, SQPNP, etc.), limite de reprojeção e confiança.
4. Detectando Degeneração
Conjuntos de pontos coplanares
Se todos os pontos 3D estiverem no mesmo plano, a profundidade e a pose do PnP tornam-se ambíguas e a geometria pode ser igualmente explicada por uma homografia. A calibração em tabuleiro de xadrez usa deliberadamente um plano, mas você precisa escolher pontos de vista e layouts de pontos que Restrinja suficientemente os graus de liberdade da pose. Um único marcador de RA visto de frente, tornando-se instável em profundidade, é o mesmo fenômeno.
Cobertura de imagem estreita e longo alcance
O PnP usa diretamente uma imagem e pontos 3D conhecidos, portanto, a paralaxe entre quadros não é uma entrada necessária. No entanto, ele é mal condicionado quando as correspondências ocupam apenas uma pequena região da imagem, o alvo está distante e parece pequeno, ou os pontos 3D têm pouca variação de profundidade. Não aceite um resultado apenas pela contagem de pontos internos: inspecione a cobertura da imagem, o RMSE de reprojeção e a covariância da pose ou a sensibilidade a perturbações e, em seguida, integre um IMU ou sensor de profundidade quando necessário.
Calibração e sincronização
Erros na distância focal, no ponto principal e na distorção se transformam em um erro sistemático de reprojeção em todos os pontos. Uma lente cuja matriz intrínseca muda com o zoom, a temperatura ou o foco precisa ser recalibrada. Em veículos e drones, se a sincronização das linhas de um obturador rolante não estiver sincronizada com o IMU, o PnP retornará uma câmera "distorcida". pose.
5. O Papel do PnP no SLAM Visual
No SLAM Visual, à medida que o número de pontos previamente triangulados no mapa aumenta, a pose da câmera pode ser rastreada quadro a quadro com o PnP. Com a pose fixa, novos pontos são triangulados e, assim que um número suficiente de quadros-chave for acumulado, o Ajuste de Pacote otimiza conjuntamente a pose e o mapa. É mais fácil entender isso como uma divisão de trabalho: o PnP é a interface leve e o Ajuste de Pacote lida com a consistência global.
6. Lista de Verificação de Implementação
-
Calibre o K e a distorção com um padrão quadriculado ou similar e registre o erro de reprojeção.
-
Alinhe as unidades (m/mm) e o sistema de coordenadas dos pontos 3D com o estado de correção de distorção dos pontos da imagem.
-
Refine as correspondências com um teste de razão, vizinhos mais próximos mútuos e rastreamento temporal.
-
Remova outliers com RANSAC-PnP e salve o Distribuição de inliers e erro de reprojeção.
-
Verifique se a profundidade é positiva, se a mudança de pose é fisicamente plausível e se a diferença em relação ao quadro anterior é razoável.
-
Se as condições forem desfavoráveis, recorra a uma IMU, profundidade, homografia ou reinicialização.
Sequência de implementação mínima
Com o OpenCV, primeiro obtenha rvec, tvec, inliers de solvePnPRansac, passe apenas os inliers para solvePnPRefineLM e, finalmente, use projectPoints para calcular o RMSE dos inliers e a distribuição de erros. Um retorno de API bem-sucedido por si só não detecta incompatibilidades excessivas, pontos agrupados ou uma pose fisicamente impossível.
ok, rvec, tvec, inliers = cv2.solvePnPRansac(
object_points, image_points, K, dist,
flags=cv2.SOLVEPNP_EPNP,
reprojectionError=3.0, confidence=0.999, iterationsCount=200,
)
if not ok or inliers is None or len(inliers) < 6:
raise RuntimeError("PnP failed or has too few inliers")
idx = inliers.ravel()
rvec, tvec = cv2.solvePnPRefineLM(
object_points[idx], image_points[idx], K, dist, rvec, tvec
)
projected, _ = cv2.projectPoints(object_points[idx], rvec, tvec, K, dist)
rmse = np.sqrt(np.mean(np.sum(
(projected.reshape(-1, 2) - image_points[idx].reshape(-1, 2)) ** 2,
axis=1,
)))
R, _ = cv2.Rodrigues(rvec)
camera_center_world = -R.T @ tvec.reshape(3, 1)
Nem 3.0 px nem seis inliers são um limite de aceitação universal; eles são apenas valores iniciais para este exemplo. Derive os limites da resolução da imagem, da precisão dos recursos e Verifique o erro de pose permitido pelo aplicativo. Verifique também se os pontos internos não estão agrupados em um canto da imagem e se cada ponto tem profundidade de quadro da câmera Z_c>0.
7. Resumo
O PnP é a ponte que converte as correspondências entre um mapa 3D e uma imagem 2D em uma pose de câmera com 6 graus de liberdade. Construa uma solução inicial com P3P/EPnP, remova os outliers com RANSAC e refine com otimização não linear. Somente gerenciando o layout dos pontos, a calibração, a paralaxe e a sincronização de tempo em conjunto, isso se torna uma estimativa de pose estável para SLAM visual ou RA.
O PnP precisa apenas de duas imagens?
Suas entradas básicas são pontos 3D conhecidos, suas correspondências na imagem 2D e os parâmetros intrínsecos da câmera. Isso difere da estimativa de movimento de 2D para 2D. correspondências.
Comentários
Entre na sua conta para continuar.
Ainda não há dados.