2014-05-05 13 views
5

Sviluppo un semplice stabilizzatore e ho difficoltà con lo spostamento dell'immagine. Esempio: ho due immagini (A e B) spostate l'una rispetto all'altra da alcuni pixel. Calcolo l'offset utilizzando le correlazioni di fase. Il prossimo passo ho bisogno di spostare la seconda immagine per l'offset dell'immagine. Un esempio è presentato sull'immagine. Come risolvo questo problema?
Il modo più veloce per spostare l'immagine in OpenCV

C'è link anteprima immagine:

illustration

+3

puoi mostrare qualche codice di ciò che hai provato fino ad ora? –

+0

Se è possibile incorporare le immagini in immagini più grandi dall'inizio (e se è possibile limitare lo spostamento della dimensione massima del bordo) è possibile utilizzare le immagini secondarie anziché spostare nulla. – Micka

risposta

6

cv :: Rect e cv :: :: Mat copyTo

cv::Mat img=cv::imread("image.jpg"); 
cv::Mat imgTranslated(img.size(),img.type(),cv::Scalar::all(0)); 
img(cv::Rect(50,30,img.cols-50,img.rows-30)).copyTo(imgTranslated(cv::Rect(0,0,img.cols-50,img.rows-30))); 
2

Setto (0) l'immagine di destinazione, quindi utilizzare l'operatore() di cv :: Mat di creare una sottoimmagine dell'immagine di input e dell'immagine di output (userete 2 cv :: Rect con le stesse dimensioni e lo spostamento differente, la dimensione dipende dallo spostamento, ovvero una maggiore cilindrata significa una parte più piccola dell'immagine che è possibile copiare in uscita). Quindi utilizzare il metodo copyTo.

Detto questo: normalmente quando si fa una domanda si mostra un codice che mostra ciò che si è tentato finora.

1

mia implementazione permette il passaggio di essere in qualsiasi direzione ...

using namespace cv; 
//and whatever header 'abs' requires... 

Mat offsetImageWithPadding(Const Mat& originalImage, int offsetX, int offsetY, Scalar backgroundColour){ 
     padded = Mat(originalImage.rows + 2 * abs(offsetY), originalImage.cols + 2 * abs(offsetX), CV_8UC3, backgroundColour); 
     originalImage.copyTo(padded(Rect(abs(offsetX), abs(offsetY), originalImage.cols, originalImage.rows))); 
     return Mat(padded,Rect(abs(offsetX) + offsetX, abs(offsetY) + offsetY, originalImage.cols, originalImage.rows)); 
} 

//example use with black borders along the right hand side and top: 
Mat offsetImage = offsetImageWithPadding(originalImage, -10, 6, Scalar(0,0,0)); 

E 'tratto dal mio codice di lavoro ma alcune variabili sono cambiate, se non viene compilato, molto probabilmente solo una piccola cosa deve cambiare, ma si ottiene l'idea. la funzione abs ...

Problemi correlati