在我的图像中,我有一个三角形(代表箭头)。此箭头定义了所考虑的方向和区域,以便在同一图像中进一步搜索。例如,如果我有一个三角形旋转30度w.r.t x轴,它的尖端位于图像中的(250,150)。我想找到并绘制一条正常三角形尖端的线,如下图所示。
在上图中,我在三角形中有蓝线的角度,法线将被绘制。此外,三角形的尖端是已知的,这是法线上唯一已知的点。
我的python函数代码如下。此代码绘制一条线,通过尖端但不一定是NORMAL到蓝线。
def draw_intercepts(img,triangle):
tip=triangle["tip"]
x1=tip[0]
y1=tip[1]
arrow_angle=triangle["arrow_angle"]
y_intercept=int(y1+((1/np.tan(arrow_angle))*x1))
x_intercept=int(x1+(np.tan(arrow_angle)*y1))
cv2.line(img,(x_intercept,0),(0,y_intercept),[0,0,255],3,cv2.LINE_AA)
此代码是通过以下对这篇文章的回答编写的: https://math.stackexchange.com/questions/2381119/how-to-find-slope-x-and-y-intercepts-given-angle-to-the-normal-vector-and-a-poi
注意: 我按照建议更新了代码:
def draw_intercepts(img,triangle):
tip=triangle["tip"]
x1=tip[0]
y1=tip[1]
arrow_angle=triangle["arrow_angle"]
arrow_angle_rad=np.radians(arrow_angle)
y_intercept=int(y1+((1/np.tan(arrow_angle_rad))*x1))
x_intercept=int(x1+(np.tan(arrow_angle_rad)*y1))
cv2.line(img, (x_intercept, 0), (0, y_intercept), [0, 0, 255], 3, cv2.LINE_AA)
这解决了这个问题。 现在,当arrow_angle处于第一或第三象限时,该线被完美地绘制,例如0< arrow_angle< 90和180< arrow_angle<但是,在第二和第四象限(90< arrow_angle< 180和270< arrow_angle< 360)中,线角度不被绘制为正确的角度或位置。即使我不知道它是在某处绘制的,因为它在图像中不可见。
答案 0 :(得分:1)
请注意,在截距段中使用的线方程“不是通用的 - 不适用于水平和垂直线。使用截距方法情况0,Pi / 2,Pi,3 * Pi / 2或-Pi / 2必须单独处理。
如果您arrow_angle
是蓝线:
c = -Sin(arrow_angle)
s = Cos(arrow_angle)
如果您arrow_angle
是红线:
c = Cos(arrow_angle)
s = Sin(arrow_angle)
然后通过点画线
(x1 - c * 4096, y1 - s * 4096) and (x1 + c * 4096, y1 + s * 4096)
(我使用与屏幕尺寸相当的任意大常数)