OpenCV ha le funzioni estimateRigidTransform() e warpAffine() che gestiscono questo tipo di problema molto bene.
La sua più o meno semplice come questo:
Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP)
Ora output
contiene il contenuto della frame2
che è meglio allineate per adattarsi a frame1
. Per i turni di grandi dimensioni, M sarà una matrice zero o potrebbe non essere affatto una matrice, a seconda della versione di OpenCV, quindi dovresti filtrarli e non applicarli. Non sono sicuro di quanto sia grande; forse metà della larghezza del frame, forse di più.
Il terzo parametro per valutareRigidTransform è un valore booleano che indica se applicare anche una matrice affine arbitraria o limitarla alla traslazione/rotazione/ridimensionamento. Ai fini della stabilizzazione di un'immagine da una fotocamera probabilmente si desidera solo quest'ultima. In effetti, per la stabilizzazione dell'immagine della telecamera si potrebbe anche voler rimuovere qualsiasi ridimensionamento dalla matrice restituita normalizzandolo solo per rotazione e traslazione.
Inoltre, per una telecamera in movimento, probabilmente si desidera campionare M nel tempo e calcolare una media.
Ecco i link a più informazioni estimateRigidTransform(), e warpAffine()
Grande risposta! Una bella lista. Non conoscevo la correlazione di fase. Grazie ! –