Как определить угол наклона для двух и более стрелок в OpenCV?

Есть код, который определяет контур стрелки (фигуры), определяет ее размер, помещает в квадрат и по формуле определяет угол наклона, но определяет только для какой то одной. Так понял, что переменная угла для всех стрелок будет одна и будет перезаписываться. Как правильно сделать, чтобы при помещении в кадр 2+ стрелок в ряд отобразился угол наклона каждой из них?

Сам код:

import cv2
import math
import numpy as np


def getcontours(vdo,th1):
    contours, hierarchy= cv2.findContours(vdo, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours:
         area= cv2.contourArea(contour)

         if area>1000:
             cv2.drawContours(th1, contours, -1, (0,255,0), 3)

             peri=cv2.arcLength(contour, True)

             approx=cv2.approxPolyDP(contour, 0.02*peri, True)
            
             objcor=len(approx)
             x, y, w, h = cv2.boundingRect(approx)

             if objcor ==7:

                 cv2.rectangle(th1,(x,y),(x+w,y+h), (255,0,0),2)
                 
                 startpoint= (approx[0][0][0],approx[0][0][1])
                 endpoint=(int((approx[3][0][0]+approx[4][0][0])/2),int((approx[3][0][1]+approx[4][0][1])/2))
                
                 slope=(startpoint[0]-endpoint[0])/(startpoint[1]-endpoint[1])
                 angle= math.degrees(math.atan(slope))
                 print(angle)
                 font= cv2.FONT_HERSHEY_SIMPLEX
                 cv2.putText(th1, 'angle= '+str(angle), (50,50), font, 1, (224,0,0), 2)
             else:
                 pass
    
cap=cv2.VideoCapture(0)

while True:
    _, frame= cap.read()
    blur=cv2.GaussianBlur(frame, (5,5), 0)
    hsv=cv2.cvtColor(blur,cv2.COLOR_BGR2HSV)

    lower_red=np.array([0,100,100])
    upper_red=np.array([10,255,255])
    mask=cv2.inRange(hsv,lower_red, upper_red)

    result= cv2.bitwise_and(frame, frame, mask=mask)

    ab,th1=cv2.threshold(result, 130,255, cv2.THRESH_BINARY)
    th1=cv2.erode(th1,None, iterations=2)
    th1=cv2.dilate(th1, None, iterations=2)

    getcontours(mask,th1)
    
    cv2.imshow('th1', th1)
    cv2.imshow("frame", frame)
    #cv2.imshow("mask", mask)
    #cv2.imshow("result", result)
  
    key= cv2.waitKey(500)
    
    if key== 27:
        break

cap.release()
cv2.destroyAllWindows()

Ответы (1 шт):

Автор решения: MBo

Что-нибудь такое:

for ix, contour in enumerate(contours):
   ...
   cv2.putText(th1, 'angle= '+str(angle), (50,50+50*ix), font, 1, (224,0,0), 2)
   

Если эти углы ещё где-то нужны, добавляйте их в список

→ Ссылка