как вращать несколько прямоугольных координат вокруг центра изображения - PullRequest
0 голосов
/ 28 мая 2018

Когда дело доходит до проверки обнаружения объектов с помощью алгоритма компьютерного зрения, вращая тестовое изображение, можно обнаружить некоторые пропущенные объекты.Таким образом, те обнаруженные местоположения объектов, которые представлены координатами (x, y) для каждой точки в прямоугольниках, должны быть повернуты назад.Выходной сигнал детектора объектов представляет собой массив Numpy, который содержит, например, 100 элементов, каждый из которых имеет 4 пары точек, представляющих (x, y) координаты прямоугольников вокруг обнаруженных объектов, то есть массив Numpy с формой (100,8).Эти объекты были обнаружены в повернутой версии оригинальных изображений.Поэтому их необходимо повернуть назад для визуализации на исходном изображении.Исходное изображение имеет разрешение 5616x3744px, а повернутая версия, например, на 90 градусов, имеет 3744x5616px.

  • каждая строка имеет вид [x1, y1, x2, y2, x3, y3, x4, y4]

Вопрос в том, как мы можем повернуть все эти точки в одну линию вокруг центра изображения, которое мы будем считать (2808, 1872).Когда я запускаю следующий код, Python выдает ошибку ValueError: operands could not be broadcast together with shapes (1000,8) (2,), что имеет смысл.Скорость важна в этом случае.Поэтому я стараюсь не использовать петли for.

def Rotate2D(pts,cnt,degree):
    ang = math.radians(degree)
    '''pts = {} Rotates points(nx2) about center cnt(2) by angle ang(1) in radian'''
    return scipy.dot(pts-cnt,scipy.array([[scipy.cos(ang),scipy.sin(ang)],[-scipy.sin(ang),scipy.cos(ang)]]))+cnt

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

С помощью @AGNGazer на этот вопрос был дан ответ.Сначала необходимо сместить все точки вокруг центра: [0, 0] Давайте рассмотрим 2 объекта, а не 100 объектов для простоты и поворота на 90 градусов.

old_coord = np.zeros((2,8))
old_coord [0] = [500, 500, 510, 500, 510, 510, 500, 510] # only filling one is enough to show the functionality.

смещение кцентр с использованием повернутых центров изображений [1872,2808].

old_coord [:, list(range(0, 8, 2))] -= 1872
old_coord [:, list(range(1, 8, 2))] -= 2808

применить функцию @AGNGazer.

new_coord = Rotate2D(old_coord, [0, 0], 90)

смещение к центру исходного изображения [1872, 2808]

new_coord [:, list(range(1, 8, 2))] += 1872
new_coord [:, list(range(0, 8, 2))] +=  2808
>>> new_coord
array([[5116.,  500., 5116.,  510., 5106.,  510., 5106.,  500.],
   [0.,  0., 0.,  0., 0.,  0., 0.,  0.]])
0 голосов
/ 28 мая 2018

Проблема в том, что вы пытаетесь вычесть "центр" - двухэлементный вектор из (100, 8) "массива координат".В каком пространстве?8D?Если это так, центр также должен быть списком из 8 координат, потому что точка в пространстве 8D определяется путем предоставления ее координат вдоль каждой из 8 осей.

Ваш код работает, если массив координат имеет форму(100, 2).


Если, когда вы говорите "100 элементов, каждый из которых имеет 8 точек, представляющих (x,y)" , вы имеете в виду, что каждая строка в массиве содержит 4 (не8) точки (то есть пары x и y), такие как x1, y1, x2, y2, x3, y3, x4, y4,тогда лучший способ справиться с этим - изменить массив pts:

import numpy as np
def Rotate2D(pts, cnt, degree):
    ang = math.radians(degree)
    m = scipy.array([[scipy.cos(ang), scipy.sin(ang)],
                     [-scipy.sin(ang), scipy.cos(ang)]])
    rpts = scipy.dot(np.reshape(pts, (pts.size // 2, 2)) - cnt, m) + cnt
    rpts = np.reshape(rpts, pts.shape)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...