Перспективное преобразование массива с координатами

У меня есть массив с координатами (2D) и я хочу вычислить новые координаты в другом четырехугольнике. Я знаю только углы обоих четырехугольников.

Так, например, старые угловые координаты четырехугольника

topleft(25,25), Topright(200,20), Botomleft(35,210), Botomright(215,200)

новый четырехугольник:

Topleft(-50,50), Topright(50,50), Botomleft(-50,-50), Botomright(-50,-50)

Есть ли в opencv (cv2) специальная функция для этого или даже формула.

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


person Rens    schedule 02.12.2014    source источник


Ответы (1)


Если я правильно понимаю, в opencv есть то, что вам нужно:

Сначала вычислите матрицу преобразования:

import cv2
import numpy as np
src = np.array(((25, 25), (200, 20), (35, 210), (215, 200)), dtype=np.float32)
dest = np.array(((-50, -50), (50, -50), (-50, 50), (50, 50)), dtype=np.float32)
mtx = cv2.getPerspectiveTransform(src, dest)

Вы заметите, что я позволил себе сделать ориентацию dest совпадающей с ориентацией src перед вычислением преобразования (перевернутые верх и низ).

Теперь эту матрицу можно использовать для преобразования любого массива точек (в нашем случае 2D):

original = np.array([((42, 42), (30, 100), (150, 75))], dtype=np.float32)
converted = cv2.perspectiveTransform(original, mtx)

Результат:

>>> converted
>>> array([[[-41.06365204 -40.27705765]
      [-49.48046112  -8.70405197]
      [ 18.60642052 -19.92881393]]])

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

person Arnaud P    schedule 03.12.2014