2015-10-22 1 views
1

У меня эти данные из видео.Преобразование нерегулярного четырехугольника в прямоугольник в python matplotlib

  • Вершины прямоугольника
  • точек с отслеживанием животных внутри прямоугольника.

Из-за деформации изображения мой «прямоугольник» не является регулярным. Я хочу преобразовать данные, чтобы построить их в matplotlib как прямоугольник.

Есть ли простой способ?

Это maze and trancking. Я разлагаю его на пять четырехугольников

+1

Это потребует больше, чем просто Matplotlib. У вас есть данные для вершин на каждом кадре? – wgwz

+0

Вершины фиксированы.Камера и лабиринт находятся в одном и том же положении на протяжении всего эксперимента. – heracho

+0

Не могли бы вы поделиться имиджем? Прямо здесь или ссылку на одну. – wgwz

ответ

3

Вы можете использовать skimage.transform.ProjectiveTransform от scikit-image, чтобы преобразовать координаты внутри вашего четырехугольника в локальное квадратное пространство [0, 1] × [0, 1].

Для получения дополнительной информации о том, как применить линейную алгебру, чтобы решить эту проблему, см ProjectiveTransform.estimate или «Projective Mappings for Image Warping» Пола Heckbert, 1999.

Предположим, у вас есть уголки четырехугольника в порядке по часовой стрелке:

bottom_left = [58.6539, 31.512] 
top_left = [27.8129, 127.462] 
top_right = [158.03, 248.769] 
bottom_right = [216.971, 84.2843] 

мы создаем ProjectiveTransform и попросить его найти проективные точки отображения преобразования внутри четырехугольника на единицу площади:

from skimage.transform import ProjectiveTransform 
t = ProjectiveTransform() 
src = np.asarray(
    [bottom_left, top_left, top_right, bottom_right]) 
dst = np.asarray([[0, 0], [0, 1], [1, 1], [1, 0]]) 
if not t.estimate(src, dst): raise Exception("estimate failed") 

Теперь трансформация t готова превратить ваши точки в единицу площади. Конечно, изменяя dst выше, вы можете масштабировать до другого прямоугольника, чем квадрат единицы (или даже совершенно другой четырехугольник).

data = np.asarray([ 
    [69.1216, 51.7061], [72.7985, 73.2601], [75.9628, 91.8095], 
    [79.7145, 113.802], [83.239, 134.463], [86.6833, 154.654], 
    [88.1241, 163.1], [97.4201, 139.948], [107.048, 115.969], 
    [115.441, 95.0656], [124.448, 72.6333], [129.132, 98.6293], 
    [133.294, 121.731], [139.306, 155.095], [143.784, 179.948], 
    [147.458, 200.341], [149.872, 213.737], [151.862, 224.782], 
]) 
data_local = t(data) 

Нанесем входные данные и преобразованные данные, чтобы увидеть работу преобразования:

import matplotlib.pyplot as plt 
plt.figure() 
plt.plot(src[[0,1,2,3,0], 0], src[[0,1,2,3,0], 1], '-') 
plt.plot(data.T[0], data.T[1], 'o') 
plt.figure() 
plt.plot(dst.T[0], dst.T[1], '-') 
plt.plot(data_local.T[0], data_local.T[1], 'o') 
plt.show() 

Input data Result

+0

Это работа !!!. У меня были только проблемы с линией _if, а не t.estimate (src, dst): raise Exception («сбой оценки») _ Он дал исключение. Я только ставил _t.estimate (scr, dst) _ и запускал. благодаря – heracho

0

Here is a tool you can use for corner detection. Обратите внимание, что в этом примере они также касаются деформации и аффинных преобразований. Вот основной пример определения угла. Я предполагаю, что у вас нет координат для прямоугольников в ваших изображениях.

import matplotlib.pyplot as plt 
from skimage.feature import corner_harris, corner_subpix, corner_peaks 

image = plt.imread('test.jpg') 

coords = corner_peaks(corner_harris(image), min_distance=2) 
coords_subpix = corner_subpix(image, coords, window_size=13) 

fig, ax = plt.subplots() 
ax.imshow(image,cmap=plt.cm.gray) 
ax.plot(coords[:,1],coords[:,0],'.b',markersize=5) 
plt.title("Example of corner detection") 
ax.axis((0,800,800,0)) 
plt.xlabel('x (pixels)') 
plt.ylabel('y (pixels)') 

Это выводит это изображение, вы можете увидеть четырехугольник был моим образом и skimage нашли углы (синие точки):

corner detect

Я оставлю преобразование в прямоугольник до вы. Инструмент AffineTransformation сделает трюк. Он сдвинет точки, чтобы сформировать прямоугольник. Если я сделаю какой-либо прогресс в этом, я добавлю к сообщению.

+0

Возможно, я оговорился, у меня есть баллы. Они извлекаются вручную в графическом интерфейсе, который использует Opencv. – heracho

+0

Нет, я сделал предположение и ошибся. [Это все равно поможет вам.] (Http://scikit-image.org/docs/dev/api/skimage.transform.html?highlight=hough_line#affinetransform). Или вы можете просто взглянуть на матрицы вращения через 'numpy.linalg'. Я думаю, что это где матрицы вращения ... – wgwz

+0

Обмен изображениями по-прежнему поможет! – wgwz

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