#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 — это было бы излишним.