Opencv实现计算两条直线或线段角度方法详解
目录
- 方法一
- 方法二
- 方法三
方法一
通过斜率关系计算,公式如下图:
需注意在求斜率时不要出现竖直情况,python计算会报错,但按理说应该可以计算出无穷的,此处先放这吧,等后期有时间再来解释这里原因。
#openpose求角度 def GetAngle(line1, line2): """ 计算两条线段之间的夹角,若已知两直线斜率:m1,m2 angle = atan(abs((m2 - m1) / (1 www.devze.com+ (m2 * m1))) :param line1: :param line2: :return: """ dx1 = line1[0][0] - line1[1][0] dy1 = line1[0][1] - line1[1][1] dx2 = line2[0][0] - line2[1][0] dy2 = line2[0][1] - line2[1][1] #求斜率 编程客栈 m1=dy1/dx1 m2=dy2/dx2 insideAngle=math.atan(abs((m2-m1)/(1+(m1*m2)))) jsangle=insideAngle/math.pi*180 if angle>-370 and angle<370: angle=int(angle) return angle
方法二
#openpose求角度 def GetAngle(line1, line2): """ 计算两条线段之间的夹角 :param line1: :param line2: :return: """ dx1 = line1[0][0] - line1[1][0] dy1 = line1[0][1] - line1[1][1] dx2 = line2[0][0] - line2[1][0] dy2 = line2[0][1] - line2[1][1] angle1 = math.atan2(dy1, dx1) angle1 = int(angle1 * 180 / math.pi) # print(angle1) angle2 = math.atan2(dy2, dx2) angle2 = int(angle2 * 180 / math.pi) # print(angle2) if angle1 * angle2 >= 0: insideAngle = abs(angle1 - angle2) else: insideAngle = abs(angle1) + abs(angle2) python if insideAngle > 180: insideAngle = 360 - insideAngle insideAngle = insideAngle % 180 return insideAngle
方法三
通过余弦定理计算三点角度:
若三边为a,b,c ,则如图所示,在△ABC中:
使用前提:分母不要有出现0的情况。
实现:通过三点构成三角形,先计www.devze.com算各边长度,再带入余弦公式求解角度
def DIST(p1,p2): ''' func:求两点间距离 @para p1,p2:点坐标(x1,y1),(x2,y2) @para return:距离 ''' return math.sqrt((p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1])) # #openpose求角度 def GetAngle(p1,p2,p3): """ 若已知3点,求以中间点为原点的夹角 :param p1,p2,p3:点坐标(x,y) :param return: 角度 """ #余弦定理求夹角 A=DIST(p1,p2) B=DIST(p2,p3) C=DIST(p1,p3) angle=math.acos((A*A+B*B-C*C)/(2*A*B)) return angle/math.pi*180
到此这篇关于Opencv实现计算两条直线或线段角度方法详解的文章就介绍到这了,更多相关Opencv计算两条直线内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
开发者_开发教程
精彩评论