【问题标题】:Draw a line on an image using angle and center point using Python使用 Python 使用角度和中心点在图像上绘制一条线
【发布时间】:2021-03-17 09:51:54
【问题描述】:

我的代码遇到了一个小问题。我有一个坐标和天使的数据框。 我想在某个角度(比如 45 度)上从某个 xy 坐标到图像边缘画一条线。

如何使用 PIL 做到这一点?循环 x2 = x + length*cos(angle) 看起来不是一个好的解决方案(但我在这里可能错了)。

提前致谢。

【问题讨论】:

  • 一种很好理解(但不是最快)的方法是为该角度定义一个 3x3 旋转矩阵(参见互联网)并将 x 轴方向定义为 (1,0) 并使用旋转矩阵(opencv 函数透视变换或具有齐次坐标的矩阵乘法),那么您就有了直线的 DIRECTION 向量。如有必要,对其进行归一化以获得矢量长度 1。现在您可以从 center - length/2.0*direction 到 center + length/2.0*direction 画一条线

标签: python opencv python-imaging-library


【解决方案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) 之间画一条线。

如果你有更好的解决方案,我会很感兴趣。

【讨论】:

  • 是的 - 在这种情况下使用 sin 和 cos 比完整的 3x3 转换矩阵要好 - 这将是矫枉过正。
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多