Поиск сдвига одного изображения относительно другого?
=======================================================

 Даны две фотографии, одна сделана со смещенного и повернутого ракурса (вектор смещения и угол поворота предполагаются не слишком большими). Требуется найти вектор смещения и углы поворота.  

Интересен так же ответ для случая, когда поворот отсутствует.  

В какую сторону смотреть, что почитать? Можно ли реализовать через поиск особых точек на изрображениях? 

 Про OpenCV не подскажу, но я бы написал это вручную. Идея простая: Задаем функцию которая проверяет истинность (точнее обратное ей значение, типа "ложность") гипотезы что второе изображение является первым изображением, сдвинутым по осям ровно на значения X, Y. Эта функция рассчитывается (например) как сумма квадратов разностей значений соответствующих пикселов первого изображения и второго, сдвинутого на -X, -Y. Имея такую функцию дальше просто находим ее минимум методом градиентного спуска (начальные значения X=0, Y=0), полученные X, Y и будут рассчитанными значениями смещения второго изображения от первого.  

С поворотом все аналогично, только добавляется еще одна одна переменная - градус поворота. Но функция проверки гипотезы становится значительно тяжелее в вычислительном плане: на каждый пиксел пойдет минимум одна тригонометрическая функция (относительно тяжелая для CPU), плюс этим обламывается SIMD оптимизация, которая дает многократное ускорение для первого варианта без поворота. 

 Если необходимо вычислить только сдвиг, то используйте phaseCorrelate. Если необходимо вычислить поворот и сдвиг, то алгоритм действия такой:  

1. если изображения прямоугольные, то вырезаем квадрат по меньшей стороне. Затем умножаем на окно Ханна (createHanningWindow);  

2. вычисляем дпф;  

3. вычисляем логарифм амплитудных спектров;  

4. переводим получившиеся изображения в полярную систему координат; [https://www.youtube.com/watch?v=JZRSDDzTwts&ab\_cha...](https://www.youtube.com/watch?v=JZRSDDzTwts&ab_channel=DenisErokhin)  

5. используя phaseCorrelate получаем оценку поворота (сдвиг по OY, если память не изменяет);  

6. поворачиваем исходное изображения;  

7. с помощью phaseCorrelate находим сдвиг; 

[Пример](http://www.mathworks.com/help/vision/examples/find-image-rotation-and-scale-using-automated-feature-matching.html) из MatLab'а 

 В OpenCV есть phaseCorrelate на выходе получите направление смещения. 

 этот блог прочитайте  

[www.pyimagesearch.com/2015/03/16/image-pyramids-wi...](http://www.pyimagesearch.com/2015/03/16/image-pyramids-with-python-and-opencv/)