У вас есть какие-то неправильные представления о процессе.
Метод cv :: evaluationRigidTransform принимает в качестве входных данных два набора соответствующих точек. А затем решает систему уравнений найти матрицу преобразования. Результат преобразования соответствует src указывает на точки dst (точно или близко, если точное совпадение невозможно - например, плавающие координаты).
Если вы применяете оценкуRigidTransform на двух изображениях, OpenCV сначала находит соответствующие пары точек, используя некоторый внутренний метод (см. opencv docs).
cv :: warpAffine затем преобразует изображение src в dst согласно заданной матрице преобразования. Но любое (почти любое) преобразование - операция потери. Алгоритм должен оценивать некоторые данные, поскольку они недоступны. Этот процесс называется интерполяцией, используя известную информацию, которую вы вычисляете неизвестным значением. Некоторую информацию о масштабировании изображения можно найти на wiki. Те же правила применяются к другим преобразованиям - вращению, перекосу, перспективе ... Очевидно, это не относится к переводу.
Учитывая ваши тестовые изображения, я бы предположил, что OpenCV воспринимает абажур как ссылку. Из разницы ясно, что абажур лучше трансформируется. По умолчанию OpenCV использует линейную интерполяцию для деформирования, поскольку это самый быстрый метод. Но вы можете установить более продвинутый метод для достижения лучших результатов - снова обратитесь к opencv docs.
Вывод: Полученный результат очень хорош, если вы помните, это результат автоматизированного процесса. Если вам нужны лучшие результаты, вам нужно будет найти другой метод для выбора соответствующих точек. Или используйте лучший метод интерполяции. В любом случае, после преобразования, diff не будет 0. Это практически невозможно достичь, потому что битмап - это дискретная сетка пикселей, поэтому всегда будут какие-то промежутки, которые необходимо оценить.
Прежде всего, чего именно вы хотите достичь? Конечно, при выполнении общего преобразования abs-diff будет отличным от нуля. Даже изменение вращения на 1 градус вызовет большие изменения из-за интерполяции пикселей. – jnovacho
Здравствуйте, jnovacho, я хочу исправить изображения с помощью opencv – Mudasar
Я до сих пор не вижу проблемы. Твой код мне кажется хорошим. Можете ли вы предоставить несколько скриншотов - исходное и целевое изображение и вывод изображения. – jnovacho