Qual è il legame tra l'omografia calcolata su 2 immagini e l'omografia calcolata sulle stesse immagini sottosopra?


9

Con OpenCV , computo l'omografia tra, diciamo, queste due immagini:

prima immagine

e

seconda immagine

Non preoccuparti della strana forma bianca sul lato destro, è dovuta al supporto per smartphone che uso. L'omografia, data dalla funzione findHomography () (utilizzando i punti rilevati con il rilevatore di funzionalità Fast e il matcher del descrittore di HammingLUT ), è:

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

Ora, utilizzo lo stesso processo per calcolare l'omografia tra le stesse immagini che sono state ruotate di 180 gradi (sottosopra), usando imagemagick (di fatto, sarei altrettanto interessato a conoscere la relazione per una rotazione di 90 o 270 gradi ...). Eccoli:

prima immagine sottosopra

e

seconda immagine sottosopra

Con queste immagini, l'omografia diventa:

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

Ora, la domanda è: come si collega A e B? I due primi valori diagonali di A sono vicini all'inverso dello stesso in B, ma non è molto preciso (.707805537 invece di 0.71486885). Il mio scopo finale sarebbe quello di utilizzare la relazione desiderata per trasformare la matrice finale, evitando di calcolare una rotazione dell'immagine costosa.

Risposte:


4

Hba=RtnTd
Rbatabnd

La relazione tra le due matrici risiede nel vettore normale del piano. Quindi è necessario ottenere il vettore normale del piano (fuori dalla matrice di omografia) e applicare la rotazione ad esso, quindi calcolare la matrice di omografia utilizzando la formula sopra. Per la corretta decomposizione della matrice di omografia, puoi guardare questi esempi di codice e questo documento .


Non capisco davvero cosa intendi. Dall'equazione, ho ottenuto il normale Mat invT = 1./t; Mat n = invT.t() * (H - R);(in realtà lo è n/d). Ora, "applicando la rotazione ad esso" mi dà un vettore 3x1, ma come posso usarlo per calcolare nuovamente la matrice di omografia? Grazie
Stéphane Péchard il

Aggiunte ulteriori informazioni, spero che lo chiarisca.
Geerten,

perché è - t / d e non + t / d?
Maystro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.