Opencv實現(xiàn)計算兩條直線或線段角度方法詳解
更新時間:2022年12月07日 14:26:20 作者:明月醉窗臺
這篇文章主要介紹了Opencv實現(xiàn)計算兩條直線或線段角度方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
方法一
通過斜率關系計算,公式如下圖:
需注意在求斜率時不要出現(xiàn)豎直情況,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中:
使用前提:分母不要有出現(xiàn)0的情況。
實現(xiàn):通過三點構成三角形,先計算各邊長度,再帶入余弦公式求解角度
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實現(xiàn)計算兩條直線或線段角度方法詳解的文章就介紹到這了,更多相關Opencv計算兩條直線內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
研究Python的ORM框架中的SQLAlchemy庫的映射關系
這篇文章主要介紹了研究Python的ORM框架中的SQLAlchemy庫的映射關系,SQLAlchemy庫是一個常見的Python中操作數據庫的工具,需要的朋友可以參考下2015-04-04