在我的图像中,我有一个三角形(代表一个箭头)。此箭头定义了要考虑在同一图像中进行进一步搜索的方向和区域。例如,如果我有一个x轴以30度w.r.t旋转的三角形,并且它的尖端位于图像中的(250,150)。我想找到并垂直于三角形的尖端绘制一条线,如下图所示。

在上图中,我在三角形中具有蓝线的 Angular ,要向其绘制法线。三角形的尖端也是已知的,这是法线唯一的已知点。

我的python函数代码如下。这段代码画一条线,穿过笔尖,但不一定是蓝线。

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

最佳答案

请注意,“在截距段中”使用的线方程式不是通用的-不适用于水平线和垂直线。对于拦截方法,必须分别处理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)

(我使用了与屏幕尺寸相当的任意大常量)

关于python - 给定角度和直线上的点画一条线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45499935/

10-08 22:14