2013-05-31 15 views
5

Sono nuovo di Open Cv, voglio trasformare le due immagini src e dst image. Sto usando cv::estimateRigidTransform() per calcolare la matrice di trasformazione e successivamente usando cv::warpAffine() per trasformare da dst a src. quando paragono la nuova immagine trasformata con l'immagine di src è quasi la stessa (trasformata), ma quando ottengo la differenza di abs della nuova immagine trasformata e dell'immagine src, c'è molta differenza. cosa dovrei fare in quanto la mia immagine dst ha anche un fattore di rotazione e traduzione. Ecco il mio codiceOpencv Transforming Image

cv::Mat transformMat = cv::estimateRigidTransform(src, dst, true); 
cv::Mat output; 
cv::Size dsize = leftImageMat.size(); //This specifies the output image size--change needed 
cv::warpAffine(src, output, transformMat, dsize); 

Src Immagine

enter image description here

destinazione Immagine

enter image description here

immagine di output

enter image description here

assoluto Differenza Immagine

enter image description here

Grazie

+0

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

+0

Ciao, jnovacho, voglio correggere le immagini usando opencv – Mudasar

+0

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

risposta

4

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.

+0

Ok grazie :) per la spiegazione – Mudasar

+0

Ciao jnovacho, puoi dirmi come impostare la rotazione al centro prima di applicare il distorsione di curvatura, in realtà lo ruota dall'angolo in alto a sinistra mentre in stereo le immagini il più delle volte la rotazione è dal centro Grazie – Mudasar

+1

Ciao, c'è un problema. Tutte le trasformazioni sono rispetto all'origine [0,0]. Quindi il trucco qui è tradurre il centro desiderato in origine, eseguire la rotazione e tradurre indietro. Alcune informazioni sulle trasformazioni della matrice sono disponibili qui http://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htm Ma non penso che funzioni in OpenCV, dato che avresti perso i dati in coordinate negative. Inoltre, non penso che tu abbia davvero bisogno di questo. Le funzioni gestiscono internamente questo problema, trasforma l'immagine in modo che i corrispondenti punti corrispondano. – jnovacho