OpenCV Warp перспектива всего изображения

Я борюсь с этой проблемой:

У меня есть изображение, и я хочу применить к нему перспективу деформации (у меня уже есть матрица преобразования), но вместо вывода, имеющего только область преобразования (как в примере ниже), я хочу иметь возможность видеть все изображение вместо ,

ПРИМЕР http://docs.opencv.org/trunk/_images/perspective.jpg

Вместо области преобразования, как в этом примере, я хочу преобразовать все исходное изображение.

Как мне этого добиться?

Спасибо!

0

Решение

Кажется, что вы вычисляете перспективное преобразование, выбирая углы сетки судоку во входном изображении и запрашивая их деформацию в фиксированном месте в выходном изображении. В вашем примере кажется, что вы запрашиваете деформацию верхнего левого угла в координатах (0,0), в верхнем правом углу в (300,0), в нижнем левом углу в (0,300) и нижнем нижнем углу. прямо на (300 300).

Это всегда приводит к обрезке области изображения слева от двух левых углов и над двумя верхними углами (то есть области изображения, где х<0 или у<0 в выходном изображении). Кроме того, если вы укажете размер выходного изображения 300×300, это приведет к обрезке области изображения справа направо и под нижними углами.

Если вы хотите сохранить все изображение целиком, вам нужно использовать разные выходные координаты для углов. Например, деформируйте TLC до (100, 100), TRC до (400,100), BLC до (100,400) и BRC до (400,400) и укажите, например, размер выходного изображения 600×600.

Вы также можете рассчитать оптимальные координаты следующим образом:

  1. Вычислить перспективное преобразование по умолчанию H0 (как вы делаете сейчас)
  2. Преобразуйте углы входного изображения, используя H0, и вычислите минимальное и максимальное значения для координат x и y этих углов. Обозначим их xmin, xmax, ymin, ymax.
  3. Вычислите перевод, необходимый для отображения точки (xmin, ymin) в (0,0). Матрица этого перевода T = [1, 0, -xmin; 0,1-имин; 0, 0, 1].
  4. Вычислите оптимизированное перспективное преобразование H1 = T * H0 и укажите размер выходного изображения (xmax-xmin) x (ymax-ymin).

Таким образом, вам гарантировано, что:

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

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

Изменить 1: Если вы хотите заменить черные области чем-то другим, вы можете инициализировать матрицу назначения по своему желанию, а затем установить borderMode параметр warpPerspective функция к BORDER_TRANSPARENT,

1

Другие решения


По вопросам рекламы [email protected]