2013-05-31 2 views
5

Я новичок в Open Cv, я хочу преобразовать два изображения src и dst. Я использую cv::estimateRigidTransform() для вычисления матрицы преобразования, а затем с помощью cv::warpAffine() для преобразования из dst в src. когда я сравниваю новое преобразованное изображение с изображением src, он почти такой же (преобразованный), но когда я получаю разность абзацев нового преобразованного изображения и изображения src, есть большая разница. что я должен делать, поскольку у моего dst-изображения есть некоторый коэффициент вращения и коэффициент перевода. Вот мой кодOpencv Transforming Image

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 Изображение

enter image description here

назначения Изображение

enter image description here

вывода изображения

enter image description here

абсолютная разница Изображение

enter image description here

Благодаря

+0

Прежде всего, чего именно вы хотите достичь? Конечно, при выполнении общего преобразования abs-diff будет отличным от нуля. Даже изменение вращения на 1 градус вызовет большие изменения из-за интерполяции пикселей. – jnovacho

+0

Здравствуйте, jnovacho, я хочу исправить изображения с помощью opencv – Mudasar

+0

Я до сих пор не вижу проблемы. Твой код мне кажется хорошим. Можете ли вы предоставить несколько скриншотов - исходное и целевое изображение и вывод изображения. – jnovacho

ответ

4

У вас есть какие-то неправильные представления о процессе.

Метод cv :: evaluationRigidTransform принимает в качестве входных данных два набора соответствующих точек. А затем решает систему уравнений найти матрицу преобразования. Результат преобразования соответствует src указывает на точки dst (точно или близко, если точное совпадение невозможно - например, плавающие координаты).

Если вы применяете оценкуRigidTransform на двух изображениях, OpenCV сначала находит соответствующие пары точек, используя некоторый внутренний метод (см. opencv docs).

cv :: warpAffine затем преобразует изображение src в dst согласно заданной матрице преобразования. Но любое (почти любое) преобразование - операция потери. Алгоритм должен оценивать некоторые данные, поскольку они недоступны. Этот процесс называется интерполяцией, используя известную информацию, которую вы вычисляете неизвестным значением. Некоторую информацию о масштабировании изображения можно найти на wiki. Те же правила применяются к другим преобразованиям - вращению, перекосу, перспективе ... Очевидно, это не относится к переводу.

Учитывая ваши тестовые изображения, я бы предположил, что OpenCV воспринимает абажур как ссылку. Из разницы ясно, что абажур лучше трансформируется. По умолчанию OpenCV использует линейную интерполяцию для деформирования, поскольку это самый быстрый метод. Но вы можете установить более продвинутый метод для достижения лучших результатов - снова обратитесь к opencv docs.

Вывод: Полученный результат очень хорош, если вы помните, это результат автоматизированного процесса. Если вам нужны лучшие результаты, вам нужно будет найти другой метод для выбора соответствующих точек. Или используйте лучший метод интерполяции. В любом случае, после преобразования, diff не будет 0. Это практически невозможно достичь, потому что битмап - это дискретная сетка пикселей, поэтому всегда будут какие-то промежутки, которые необходимо оценить.

+0

Хорошо спасибо :) за объяснение – Mudasar

+0

Привет, jnovacho, можете ли вы рассказать мне, как установить поворот в центр, прежде чем наносить аффинцию основы, на самом деле он вращает ее из левого верхнего угла, а в стерео изображениях большую часть времени вращается находится от центра. Спасибо – Mudasar

+1

Привет, есть улов. Все преобразования относятся к началу координат [0,0]. Таким образом, трюк здесь заключается в том, чтобы перевести желаемый центр в исходное положение, выполнить поворот и перевести назад. Некоторая информация о матричных преобразованиях приведена здесь http://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htm Но я не думаю, что это сработало бы в OpenCV, так как вы потеряли бы данные в отрицательные координаты. Плюс я не думаю, что вам это действительно нужно. Функции, связанные с этой проблемой внутри, преобразуют изображение так, чтобы соответствующие точки совпадали. – jnovacho