Нарисуйте линию на изображении, используя угол и центральную точку, используя Python

#python #opencv #python-imaging-library

Вопрос:

Я столкнулся с небольшой проблемой в своем коде. У меня есть фрейм данных с координатами и ангелами. Я хочу провести линию от определенных координат xy к краю изображения под определенным углом (скажем, 45 градусов).

Как я могу это сделать с помощью PIL? Зацикливание на x2 = x длина*cos(угол) не выглядит хорошим решением (но здесь я могу ошибаться).

Заранее спасибо.

введите описание изображения здесь

Комментарии:

1. хороший понятный (но не самый быстрый) способ-определить матрицу вращения 3×3 для этого угла (см. Интернет) и определить направление оси x как (1,0) и преобразовать его с помощью матрицы вращения (либо преобразование перспективы функции opencv, либо умножение матрицы с однородными координатами), тогда у вас есть вектор НАПРАВЛЕНИЯ вашей линии. При необходимости нормализуйте его, чтобы получить длину вектора 1. Теперь вы можете нарисовать линию от центра — длина/2.0*направление к центру длина/2.0*направление

Ответ №1:

Спасибо, что опубликовали свое решение. Я нашел одну хорошую.

 import math

def get_coords(x, y, angle, imwidth, imheight):

    x1_length = (x-imwidth) / math.cos(angle)
    y1_length = (y-imheight) / math.sin(angle)
    length = max(abs(x1_length), abs(y1_length))
    endx1 = x   length * math.cos(math.radians(angle))
    endy1 = y   length * math.sin(math.radians(angle))

    x2_length = (x-imwidth) / math.cos(angle 180)
    y2_length = (y-imheight) / math.sin(angle 180)
    length = max(abs(x2_length), abs(y2_length))
    endx2 = x   length * math.cos(math.radians(angle 180))
    endy2 = y   length * math.sin(math.radians(angle 180))

    return endx1, endy1, endx2, endy2
 

Затем я просто провожу линию между (endx1, endy1) и (endx2, endy2).

Если у вас есть лучшее решение, мне было бы очень интересно его увидеть.

Комментарии:

1. Да — использование sin и cos в этом случае превосходит полную матрицу преобразования 3×3 — это было бы излишним.