2010-05-21 1 views
2

Я пытаюсь создать два изображения вместе.
Для этого я извлек возможности просеивания и нахожу совпадения на двух изображениях, используя эту реализацию C.Деформация изображений с использованием cvWarpПодробные результаты в некоторых частях изображений из видимой области

http://web.engr.oregonstate.edu/~hess/index.html

После того, что я нашел матрицу омографии с помощью соответственных точек.

http://www.ics.forth.gr/~lourakis/homest/

Но если я использую эту гомография Матрицу в функции «cvWarpPerspective», некоторые из частей изображения выходит из видимой области (отрицательные corrdinates).

Чтобы решить эту проблему, я попытался вычислить ограничивающий прямоугольник первым, проложив четыре угла изображения через матрицу гомографии. И переместите исходное изображение, затем деформируйте его. Но это привело к тому, что результат деформирования изменился.

Есть ли способ деформировать изображение и сохранить его в видимой области?

Буду признателен за любую помощь. Спасибо заранее ...

ответ

0

Я думаю, что вы на правильном пути. Вам необходимо учесть перевод изображений, который произошел при перемещении изображения.

Другой способ - нанести исходное изображение по краям. В зависимости от того, насколько меняется перспектива, вам может понадобиться немного поиграть. Кроме того, прокладка должна быть выполнена до соответствия характеристик и матрицы деформации. Очевидно, вы будете платить с точки зрения вычислений за использование большего изображения.

1

Как упражнение, я пробовал то же самое некоторое время назад и наткнулся на ту же проблему. Я решил это, сначала вычислив ограничивающий прямоугольник, как вы описали его, а затем я написал свою собственную функцию деформирования. Деформирование очень просто, однако вам нужно сделать lerp самостоятельно. Поскольку некоторый взвешивание по пикселям требуется в любом случае для достижения хороших результатов (например, несколько пикселей из разных изображений могут заканчиваться на одном и том же выходном пикселе и, следовательно, необходимо смешивать), я не чувствовал себя плохо в отказе от cvWarpPerspective.

0

Edit:

После еще некоторых работ в этом, я узнал несколько вещей:

После обнаружения вашей гомографии между Img1 и Img2, и поэтому получил матрицу преобразования от 1 до 2, вы почти готовы запустить cvWarpPerspective.

Во-первых, вам нужно наложить img1. Вы должны иметь возможность получить ограничительную рамку для img1 довольно легко. Создайте новый img размера boundingBox-> width + img2-> width * 2, boundingBox-> height + img2-> height * 2 и cvCopy img 1 в середину.

Если вы попытались cvWarpPerspective сейчас, ваше преобразование было бы отключено, потому что вы перевели img1. Нам нужно сделать еще одну матрицу для учета этого перевода. Если вы разместили img1 в середине составного изображения, вы поместили его в верхний левый угол (img2-> width, img2-> height). Сделайте матрицу трансляции = {1,0, img2-> width, 0,1, img2-> height, 0,0,0). Теперь используйте cvMatMul (перевод, гомографию, результирующий), чтобы получить окончательную матрицу преобразования.

Теперь вы можете использовать cvWarpPerspective, используя изображение с композитным размером и вашу результирующую матрицу для преобразования изображения 1.

Есть еще одна работа, которая должна быть выполнена для сшивания, но это решает вашу проблему искаженного изображения, выходящего из видимой области. Чтобы завершить сшивание, вам, вероятно, понадобится вставить изображение2 на изображение в виде композитного размера, создать маску для искаженного изображения, а затем скопировать искаженное изображение на составное изображение2, используя эту маску, чтобы вы получили красивое сшитое изображение.

Смежные вопросы