Avete alcune idee sbagliate circa il processo.
Il metodo cv :: estimateRigidTransform accetta come input due serie di punti corrispondenti. E poi risolve un insieme di equazioni per trovare la matrice di trasformazione. L'output della trasformazione corrisponde ai punti src in punti dst (esattamente o strettamente, se la corrispondenza esatta non è possibile, ad esempio le coordinate float).
Se si applica stimaRigidTransform su due immagini, OpenCV per prima cosa trova coppie di punti corrispondenti usando un metodo interno (vedere opencv docs).
cv :: warpAffine quindi trasforma l'immagine src in dst in base a una determinata matrice di trasformazione. Ma qualsiasi (quasi) qualsiasi trasformazione è un'operazione di perdita. L'algoritmo deve stimare alcuni dati, perché non sono disponibili. Questo processo è chiamato interpolazione, utilizzando informazioni conosciute si calcola il valore sconosciuto. Alcune informazioni riguardanti il ridimensionamento delle immagini sono disponibili su wiki. Le stesse regole si applicano ad altre trasformazioni: rotazione, inclinazione, prospettiva ... Ovviamente questo non si applica alla traduzione.
Date le immagini di prova, direi che OpenCV prende il paralume come riferimento. Dalla differenza è chiaro che il paralume si trasforma meglio. Predefinito OpenCV utilizza l'interpolazione lineare per la deformazione come metodo più veloce. Ma è possibile impostare un metodo più avanzato per risultati migliori - di nuovo consultare opencv docs.
Conclusione: Il risultato che si ottiene è piuttosto buono, se si tiene a mente, è il risultato di un processo automatizzato. Se vuoi risultati migliori, dovrai trovare un altro metodo per selezionare i punti corrispondenti. O utilizzare un metodo di interpolazione migliore. In ogni caso, dopo la trasformazione, il diff non sarà 0. È praticamente impossibile ottenerlo, perché la bitmap è una griglia di pixel discreta, quindi ci saranno sempre alcune lacune, che devono essere valutate.
Prima di tutto, cosa esattamente vuoi raggiungere? Ovviamente, quando si esegue una trasformazione generale, abs-diff sarà diverso da zero. Anche un cambio di rotazione di 1 grado causerà grandi cambiamenti a causa dell'interpolazione dei pixel. – jnovacho
Ciao, jnovacho, voglio correggere le immagini usando opencv – Mudasar
Non vedo ancora il problema. Il tuo codice sembra a posto per me. Potete fornire alcuni screenshot - immagine di origine e di destinazione e anche l'immagine di output. – jnovacho