Posição da câmera de computação com matriz de homografia baseada em 4 pontos coplanares

Tenho 4 pontos coplanares em um vídeo (ou imagem) representando um quadrilátero (não necessariamente um quadrado ou retângulo) e gostaria de poder exibir um cubo virtual em cima deles, onde os cantos do cubo estão exatamente no cantos do quad de vídeo.

Como os pontos são coplanares, eu posso calcular a homografia entre os cantos de um quadrado de unidade (ou seja, [0,0] [0,1] [1,0] [1,1]) e as coordenadas de vídeo do quad.

A partir desta homografia, poderei calcular uma pose correta da câmera, ou seja, [R | t] onde R é uma matriz de rotação 3x3 e t é um vetor de tradução 3x1, para que o cubo virtual fique no quad de víde

Eu li muitas soluções (algumas delas no SO) e tentei implementá-las, mas elas parecem funcionar apenas em alguns casos "simples" (como quando o quad de vídeo é quadrado), mas na maioria dos casos não funciona

Aqui estão os métodos que eu tentei (a maioria deles é baseada nos mesmos princípios, apenas o cálculo da tradução é um pouco diferente). Seja K a matriz intrínseca da câmera e H seja a homografia. Computamos:

A = K-1 * H

eja a1, a2, a3 os vetores de coluna de A e r1, r2, r3 os vetores de coluna da matriz de rotação R.

r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)

A questão é que isso não funciona na maioria dos casos. Para verificar meus resultados, comparei R et com os obtidos pelo método resolvePnP do OpenCV (usando os seguintes pontos 3D [0,0,0] [0,1,0] [1,0,0] [1,1 , 0]).

Desde que exibi o cubo da mesma maneira, notei que, em todos os casos, o discoverPnP fornece resultados corretos, enquanto a pose obtida na homografia está quase totalmente errad

Em teoria, como meus pontos são coplanares, é possível calcular a pose a partir de uma homografia, mas não consegui encontrar a maneira correta de calcular a pose a partir de H.

Algumas ideias sobre o que estou fazendo de errado?

Edite depois de tentar o método do Jav_Rock

Oi Jav_Rock, muito obrigado pela sua resposta, tentei sua abordagem (e muitas outras também) que parece estar mais ou menos bem. No entanto, ainda tenho alguns problemas ao calcular a pose com base em 4 pontos coplanares. Para verificar os resultados, comparo com os resultados do resolvePnP (que será muito melhor devido à abordagem de minimização de erros de reprojeção iterativa

Aqui está um exemplo

Cubo amarelo: Resolva PNP Cubo Negro: a técnica de Jav_Rock Cubo (s) ciano (e roxo): algumas outras técnicas, com os mesmos resultados exat

Como você pode ver, o cubo preto está mais ou menos OK, mas não parece bem proporcionado, embora os vetores pareçam ortonormai

EDIT2: Eu normalizei a v3 depois de calculá-la (para reforçar a ortonormalidade) e parece resolver alguns problemas també

questionAnswers(12)

yourAnswerToTheQuestion