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=R−tnTd
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.