Con OpenCV , computo l'omografia tra, diciamo, queste due immagini:
e
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:
e
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.
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