Qual é a ligação entre a homografia computada em 2 imagens e a homografia calculada nas mesmas imagens de cabeça para baixo?

9

Com o OpenCV , eu calculo a homografia entre, digamos, essas duas imagens:

primeira imagem

e

segunda imagem

Não se preocupe com a estranha forma branca no lado direito, é devido ao suporte para smartphone que eu uso. O homografia, dado por findHomography () função (usando pontos detectadas com o detector recurso Fast eo descritor HammingLUT matcher ), é:

A = [ 1.412817430564191,  0.0684947165270289,  -517.7751355800591;
     -0.002927297251810,  1.210310757993256,     39.56631316477566;
      0.000290600259844, -9.348301989015293e-05,  1]

Agora, eu uso o mesmo processo para calcular a homografia entre as mesmas imagens que foram giradas em 180 graus (de cabeça para baixo), usando a imagemagick (na verdade, eu estaria igualmente interessado em saber a relação para rotação de 90 ou 270 graus ...). Aqui estão eles:

primeira imagem de cabeça para baixo

e

segunda imagem de cabeça para baixo

Com essas imagens, a homografia se torna:

B = [ 0.7148688519736168,  0.01978048500375845,  325.8330631554814;
     -0.1706219498833541,  0.8666521745094313,    64.72944905752504;
     -0.0002078857275647, -5.080048486810413e-05,  1]

Agora, a questão é como você relaciona A e B? Os dois primeiros valores diagonais de A são próximos ao inverso do mesmo em B, mas não são muito precisos (0,707805537 em vez de 0,71486885). Meu objetivo final seria usar a relação desejada para transformar a matriz final, evitando calcular uma rotação de imagem dispendiosa.

Stéphane Péchard
fonte

Respostas:

4

Hba=RtnTd
Rbatabnd

A relação entre as duas matrizes está no vetor normal do plano. Portanto, você precisa obter o vetor normal do plano (fora da matriz de homografia), aplicar a rotação a ele e depois calcular a matriz de homografia usando a fórmula acima. Para a decomposição correta da matriz de homografia, você pode ver esses exemplos de código e este artigo .

Geerten
fonte
Eu realmente não entendo o que você quer dizer. A partir da equação, eu consegui o normal com Mat invT = 1./t; Mat n = invT.t() * (H - R);(na verdade é n/d). Agora, "aplicar a rotação a ele" me fornece um vetor 3x1, mas como posso usá-lo para calcular a matriz de homografia novamente? Obrigado
Stéphane Péchard
Adicionado mais informações, espero que isso fique claro.
Geerten 28/03
por que é - t / de não + t / d?
Maystro