Opencv实现计算两条直线或线段角度方法详解

作者:明月醉窗台 时间:2023-10-01 22:18:15 

方法一

通过斜率关系计算,公式如下图:

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

方法三

通过余弦定理计算三点角度:

Opencv实现计算两条直线或线段角度方法详解

若三边为a,b,c ,则如图所示,在△ABC中:

Opencv实现计算两条直线或线段角度方法详解

使用前提:分母不要有出现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

来源:https://blog.csdn.net/yohnyang/article/details/127600867

标签:Opencv,计算,直线,线段角度
0
投稿

猜你喜欢

  • asp如何显示自定义随机信息?

    2010-06-08 09:39:00
  • Pandas 对Dataframe结构排序的实现方法

    2021-11-26 09:06:48
  • 数据库性能优化之冗余字段的作用

    2011-03-03 19:21:00
  • PyCharm 常用快捷键和设置方法

    2022-04-09 01:40:59
  • MySQL自定义函数简单用法示例

    2024-01-20 12:47:17
  • Python学习笔记之抓取某只基金历史净值数据实战案例

    2021-08-14 20:28:13
  • Python+OpenCV图像处理——实现直线检测

    2021-05-15 20:13:29
  • Python实现查看系统启动项功能示例

    2022-12-27 17:03:14
  • 在Docker上开始部署Python应用的教程

    2023-11-13 12:38:37
  • python中的多重继承实例讲解

    2022-06-18 01:51:05
  • 浅谈Python flask框架

    2021-04-07 00:45:43
  • Python实现邮件自动下载的示例详解

    2023-06-15 04:44:35
  • 基于python 二维数组及画图的实例详解

    2021-12-13 08:27:46
  • Git Submodule管理项目子模块的使用

    2023-10-06 20:34:57
  • Python爬取商家联系电话以及各种数据的方法

    2023-07-24 18:39:38
  • Django 生成登陆验证码代码分享

    2021-07-31 06:48:21
  • 使用git上传到码云分支的实现

    2022-04-01 06:05:06
  • Python 限定函数参数的类型及默认值方式

    2022-02-14 22:38:00
  • Frontpage2003的怪bug,自动添加“../”的父级目录

    2007-09-30 13:30:00
  • Golang高性能持久化解决方案BoltDB数据库介绍

    2024-01-27 00:13:37
  • asp之家 网络编程 m.aspxhome.com