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ć.
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
Witaj, jnovacho, chcę poprawić obrazy przy użyciu opencv – Mudasar
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