Деформация изображений с использованием cvWarpPerspective приводит к некоторым частям изображений вне видимой области - PullRequest
2 голосов
/ 22 мая 2010

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

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 08 июня 2010

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

0 голосов
/ 11 октября 2011

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-> ширина, 0,1, img2-> высота, 0,0,0). Теперь используйте cvMatMul (перевод, гомография, результирующий), чтобы получить окончательную матрицу преобразования.

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

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

0 голосов
/ 02 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...