2014-05-05 26 views
5

Tworzę prosty stabilizator i mam problemy z przesunięciem obrazu. Przykład - Mam dwa obrazy (A i B) przesunięte względem siebie o kilka pikseli. Obliczam przesunięcie za pomocą korelacji fazowych. Następnym krokiem jest przesunięcie drugiego obrazu przez przesunięcie obrazu. Przykład jest przedstawiony na obrazie. Jak rozwiązać ten problem?
Najszybszy sposób przenoszenia obrazu w OpenCV

Jest Link do podglądu:

illustration

+3

czy możesz pokazać kod, który próbowałeś do tej pory? –

+0

Jeśli możesz od początku osadzać obrazy na większych obrazach (a możesz ograniczyć przesunięcie o maksymalny rozmiar granicy), możesz użyć podobrazów zamiast przenosić czegokolwiek. – Micka

Odpowiedz

6

cv :: Rect i 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) obrazu docelowego, a następnie użyć operatora() z cv :: Mat stworzyć subimage obrazu wejściowego i obrazu wyjściowego (użyjesz 2 cv :: Rect o tej samej wielkości i różnym przemieszczeniu, rozmiar jest zależny od przesunięcia, tzn. większe przesunięcie oznacza mniejszą część obrazu, którą możesz skopiować w wyniku). Następnie użyj metody copyTo.

Powiedział tak: zwykle, zadając pytanie, pokażesz kod pokazujący dotychczasowe próby.

1

Moja implementacja pozwala na przesunięcie się w kierunku dowolny ...

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)); 

Zajęło z własną rękę działający kod, ale niektóre zmienne uległy zmianie, jeśli się nie skompiluje, najprawdopodobniej mała rzecz wymaga zmiany - ale masz pomysł na ponowne. funkcja abs ...

Powiązane problemy