2013-05-31 29 views
5

Jestem nowy w Open Cv, chcę przekształcić dwa obrazy src i dst. Używam cv::estimateRigidTransform() do obliczenia macierzy transformacji, a następnie za pomocą cv::warpAffine() przekształcenia z dst na src. kiedy porównuję nowy przekształcony obraz z obrazem src, jest prawie taki sam (przekształcony), ale kiedy dostaję różnicę abs z nowego przekształconego obrazu i obrazu src, jest duża różnica. co powinienem zrobić, ponieważ obraz My dst ma również pewien współczynnik rotacji i translacji. tutaj jest mój kodPrzekształcanie obrazu Opencv

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 Obraz

enter image description here

przeznaczenia Obraz

enter image description here

wyjście obrazu

enter image description here

bezwzględna różnica Obraz

enter image description here

Dzięki

+0

Po pierwsze, co dokładnie chcesz osiągnąć? Oczywiście, podczas wykonywania jakiejś ogólnej transformacji, abs-diff będzie niezerowy. Nawet zmiana rotacji o 1 stopień spowoduje duże zmiany z powodu interpolacji pikseli. – jnovacho

+0

Witaj, jnovacho, chcę poprawić obrazy przy użyciu opencv – Mudasar

+0

Nadal nie widzę problemu. Twój kod wydaje mi się w porządku. Czy możesz podać kilka zrzutów ekranu - obraz źródłowy i docelowy oraz obraz wyjściowy. – jnovacho

Odpowiedz

4

Masz jakieś błędne wyobrażenia na temat tego procesu.

Metoda cv :: estimateRigidTransform przyjmuje jako dane wejściowe dwa zestawy odpowiednich punktów. A następnie rozwiązuje zestaw równań, aby znaleźć macierz transformacji. Wyjście transformacji dopasowuje punkty src do punktów dst (dokładnie lub dokładnie, jeśli dokładne dopasowanie nie jest możliwe - na przykład współrzędne pływające).

Jeśli zastosujesz estimateRigidTransform na dwóch obrazach, OpenCV najpierw znajdzie pasujące pary punktów za pomocą jakiejś wewnętrznej metody (patrz opencv docs).

cv :: warpAffine następnie przekształca obraz src na dst zgodnie z podaną macierzą transformacji. Ale każda (prawie każda) transformacja jest operacją straty. Algorytm musi oszacować niektóre dane, ponieważ nie są one dostępne. Proces ten nazywa się interpolacją, używając znanych informacji, które obliczysz nieznaną wartość. Niektóre informacje dotyczące skalowania obrazu można znaleźć na stronie wiki. To samo dotyczy innych transformacji - rotacji, pochylenia, perspektywy ... Oczywiście nie dotyczy to tłumaczenia.

Biorąc pod uwagę twoje testowe obrazy, przypuszczam, że OpenCV przyjmuje abażur jako odniesienie. Różnica jest oczywista, że ​​klosz najlepiej transformuje się. Domyślnie OpenCV używa interpolacji liniowej do wypaczenia jako najszybszej metody. Ale możesz ustawić więcej zaawansowanych metod, aby uzyskać lepsze wyniki - ponownie skonsultuj się z opencv docs.

Wniosek: Otrzymany wynik jest całkiem niezły, jeśli pamiętasz, jest to wynik zautomatyzowanego procesu. Jeśli chcesz uzyskać lepsze wyniki, musisz znaleźć inną metodę wyboru odpowiednich punktów. Lub użyj lepszej metody interpolacji. Tak czy inaczej, po transformacji różnica nie będzie równała się 0. Jest to praktycznie niemożliwe do osiągnięcia, ponieważ bitmapa jest dyskretną siatką pikseli, więc zawsze będą pewne luki, które należy oszacować.

+0

Ok dzięki :) dla wyjaśnienia – Mudasar

+0

Witaj jnovacho, czy możesz mi powiedzieć, jak ustawić obrót do środka przed zastosowaniem afpsu warp, faktycznie to obraca go z lewego górnego rogu, podczas gdy w obrazach stereo przez większość czasu obrót jest od centrum. Dzięki – Mudasar

+1

Witam, jest haczyk. Wszystkie przekształcenia odnoszą się do pochodzenia [0,0]. Sztuczka polega na przetłumaczeniu pożądanego środka na pochodzenie, obróceniu i przetłumaczeniu. Niektóre informacje na temat transformacji macierzy są dostępne pod adresem http://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htm Nie sądzę jednak, że działałoby to w OpenCV, ponieważ dane zostałyby utracone współrzędne ujemne. Plus nie sądzę, że naprawdę tego potrzebujesz. Funkcje zajmują się tym problemem wewnętrznie, przekształcają obraz tak, aby pasowały do ​​siebie odpowiednie punkty. – jnovacho

Powiązane problemy