Python如何计算图像中消失点与对应直线的夹角
消失点关联夹角计算实现方案
前置条件确认
你已获取消失点坐标(x_vp, y_vp),只需额外采集两条待计算夹角的直线上各任意1个点的像素坐标,即可完成计算。
计算步骤
- 第一步:构造两个从消失点出发的方向向量
取第一条直线上任意点p1 = (x1, y1),第二条直线上任意点p2 = (x2, y2),得到两个向量:v1 = (x1 - x_vp, y1 - y_vp),v2 = (x2 - x_vp, y2 - y_vp) - 第二步:通过向量点积公式计算夹角
夹角的余弦值公式为:cosθ = (v1·v2) / (|v1| × |v2|)
其中v1·v2是两个向量的点积,计算方式为x1×x2 + y1×y2;|v1|、|v2|分别是两个向量的模长,计算方式为√(x² + y²)。
得到余弦值后通过反余弦函数换算为弧度,再转角度即可得到最终的夹角数值。 - 第三步:特殊场景适配
如果你需要计算的是消失点和直线的夹角与水平/竖直参考线的夹角θ1、θ2,只需把上述公式中的其中一个向量替换为参考线的方向向量即可:水平向右参考向量为(1, 0),竖直向下参考向量为(0, 1)。
可直接运行的Python代码示例
import numpy as np def calc_vp_related_angle(vp_coor, line1_point, line2_point): """ 计算消失点与两条关联直线形成的夹角 :param vp_coor: 消失点像素坐标,格式为 (x_vp, y_vp) :param line1_point: 第一条直线上任意一点的像素坐标,格式为 (x1, y1) :param line2_point: 第二条直线上任意一点的像素坐标,格式为 (x2, y2) :return: 夹角数值,单位为角度 """ # 构造方向向量 vec1 = np.array([line1_point[0] - vp_coor[0], line1_point[1] - vp_coor[1]]) vec2 = np.array([line2_point[0] - vp_coor[0], line2_point[1] - vp_coor[1]]) # 计算点积 dot_val = np.dot(vec1, vec2) # 计算向量模长 norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) # 处理数值精度问题,避免反余弦函数报错 cos_theta = np.clip(dot_val / (norm1 * norm2), -1.0, 1.0) # 弧度转角度 angle_deg = np.degrees(np.arccos(cos_theta)) return angle_deg
测试样图参考

注意事项
- 图像坐标系默认Y轴向下,如果你需要将计算结果和现实世界的俯仰角、偏航角对应,需要额外做坐标系转换。
- 如果直线检测的结果已经输出了直线的斜率k,可以直接用斜率计算夹角,公式为
tanθ = |(k2 - k1)/(1 + k1×k2)|,但要注意斜率无穷大(竖直线)的特殊场景处理,用向量法兼容性更好。
内容的提问来源于stack exchange,提问作者YRR
相关产品推荐
相关产品推荐

