Python-opencv计算两条直线或者线段角度
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv
免费下载资源
·
Python-opencv计算两条直线或者线段角度
方法一
通过斜率关系计算,公式如下图:
需注意在求斜率时不要出现竖直情况,python计算会报错,但按理说应该可以计算出无穷的,此处先放这吧,等后期有时间再来解释这里原因。
#openpose求角度
def GetAngle(line1, line2):
"""
计算两条线段之间的夹角,若已知两直线斜率:m1,m2
angle = atan(abs((m2 - m1) / (1 + (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))))
angle=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)
if insideAngle > 180:
insideAngle = 360 - insideAngle
insideAngle = insideAngle % 180
return insideAngle
方法三
通过余弦定理计算三点角度:
若三边为a,b,c ,则如图所示,在△ABC中:
使用前提:分母不要有出现0的情况。
实现:通过三点构成三角形,先计算各边长度,再带入余弦公式求解角度
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
GitHub 加速计划 / opencv31 / opencv
77.37 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
2756c20e
WinRT/UWP build: fix more warnings in media part 1 天前
7654d06b - 2 天前
更多推荐
已为社区贡献12条内容
所有评论(0)