Как рассчитать позиции новых точек после поворота изображения - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь получить позиции новых точек P1_r(x1_new, y1_new) и P2_r(x2_new, y2_new) после поворота изображения с помощью imutils.rotate_bound(). Исходное изображение содержит линию, определяемую точками P1(x1, y2) и P2(x2, y2).

import imutils
import numpy as np

P1 = np.array([x1, y1])
P2 = np.array([x2, y2])

Начальная позиция следующая ( зеленая область представляет изображение ):

enter image description here

Перед вращением я должен вычислить angle между линией, определяемой точками P1(x1, y2), P2(x2, y2) и y-axis ( в данном случае Ось Y представлена ​​зеленой линией ):

enter image description here

Затем необходимо вычислить angle, где используется функция np.arccos():

if (P2[1] - P1[1]) < 0:
    y_axis_vector = np.array([0, -1])
else:
    y_axis_vector = np.array([0, 1])

if (P2[0] - P1[0]) < 0 and (P2[1] - P1[1]) :
    y_axis_vector = np.array([0, 1])

p_unit_vector = (P2 - P1) / np.linalg.norm(P2-P1)
angle = np.arccos(np.dot(p_unit_vector, y_axis_vector)) * 180 / math.pi

Затем можно повернуть изображение:

rotated_image = imutils.rotate_bound(original_image, -angle)

Таким образом, результат должен выглядеть следующим образом:

enter image description here

Сейчас я пытаюсь вычислить позиции новых точек P1_r(x1_new, y1_new) и P2_r(x2_new, y2_new). Я пытался использовать «стандартные» функции sin() и cos() для вычисления новых x и y позиций для точки P1_r:

x1_new = y1 * sin(angle) + x1 * cos(angle) 
y1_new = y1 * cos(angle) - x1 * sin(angle) 

и для точки P2_r:

x2_new = y2 * sin(angle) + x2 * cos(angle)
y2_new = y2 * cos(angle) - x2 * sin(angle) 

Однако это doesn't work, потому что вращается вся картинка, а не только линия.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 27 апреля 2020

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

Чтобы повернуть вокруг заданного начала:

def rotate(pt, radians, origin):
    x, y = pt
    offset_x, offset_y = origin
    adjusted_x = (x - offset_x)
    adjusted_y = (y - offset_y)
    cos_rad = math.cos(radians)
    sin_rad = math.sin(radians)
    qx = offset_x + cos_rad * adjusted_x + sin_rad * adjusted_y
    qy = offset_y + -sin_rad * adjusted_x + cos_rad * adjusted_y
    return qx, qy
h, w = original_image.shape[:2]
origin = (w/2, h/2)
x1_new, y1_new = rotate([x1, y1], np.radians(angle), origin)
x2_new, y2_new = rotate([x2, y2], np.radians(angle), origin)

Затем вычислите смещение в повернутом изображение:

h_new, w_new = rotated_image.shape[:2]
xoffset, yoffset = (w_new - w)/2, (h_new - h)/2

и настройки точек:

x1_new, y1_new = x1_new+xoffset, y1_new+yoffset
x2_new, y2_new = x2_new+xoffset, y2_new+yoffset
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...