Как мне использовать cv :: remap с прямой сеткой, а не с обратной сеткой, чтобы деформировать изображения? - PullRequest
9 голосов
/ 27 января 2012

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

У меня есть сетка, но нет функции деформации изображения. cv :: remap делает именно это ... но в обратном порядке - сетка "говорит", какие пиксельные окрестности отображать в регулярную сетку на выходе.

Существует ли в OpenCV стандартный способ обработки обратного деформирования? Могу ли я легко трансформировать сетку или использовать другую функцию? Я использую OpenCV и Boost, но любая бесплатная библиотека / инструмент, который делает это, будет работать для меня.

PS: мне нужно, чтобы это работало на компьютере с Linux.

Ответы [ 2 ]

1 голос
/ 20 августа 2012

Возможно, вы захотите взглянуть на http://code.google.com/p/imgwarp-opencv/. Эта библиотека, кажется, именно то, что вам нужно: искажение изображения на основе разреженной сетки.

1 голос
/ 27 января 2012

Вам нужно вычислить еще карты для обратного преобразования.

Но для этого вам нужна формула преобразования или матрица.

Шаг 1: Выберите 4 точки на переназначенном изображении. Хорошей идеей было бы взять углы, если углы не черные (не определено)

Шаг 2: Найдите свое место в исходном изображении (посмотрите на карты)

Шаг 3: Вычислить гомографию между двумя наборами точек. findHomoraphy() является ключом.

Шаг 4: Деформация в зависимости от второго изображения. Внутри он вычисляет сетки, затем вызывает remap ();

Если у вас то же преобразование, что и раньше, инвертируйте входные точки с выходными точками в findHomography или inv () полученную матрицу.

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

...