объявление переменной, не подлежащей обновлению, в функции

#python #variables #computer-vision

#python #переменные #компьютерное зрение

Вопрос:

я хочу создать функцию, которая помогает вычислять скорость обнаруженного и отслеживаемого объекта, идея состоит в том, чтобы вычислить расстояние между двумя точками p1 и p2 проблема в том, что p2 сохраняет предыдущее местоположение объекта, а p1 — фактическое местоположение объекта. как я могу ввести p2 в функцию, не инициализируясь каждый раз. я попытался объявить ее как глобальную переменную вне функции, но она не работает » ошибка: p2 не определен »

 def draw_box_label(img, bbox_cv2, box_color=(0, 255, 255), show_label=True):

'''
Helper funciton for drawing the bounding boxes and the labels
bbox_cv2 = [left, top, right, bottom]
'''

##sagem begin
global p1   
p1=[]


##sagem end
#box_color= (0, 255, 255)
font = cv2.FONT_HERSHEY_SIMPLEX
font_size = 0.7
font_color = (0, 0, 0)
left, top, right, bottom = bbox_cv2[1], bbox_cv2[0], bbox_cv2[3], bbox_cv2[2]

#sagem begin 
p1.append((left right)/2)
p1.append((top bottom)/2)

#sagem end

# Draw the bounding box
cv2.rectangle(img, (left,top), (right, bottom), box_color, 4)

if show_label:
    # Draw a filled box on top of the bounding box (as the background for the labels)
    cv2.rectangle(img, (left-2, top-45), (right 2, top), box_color, -1, 1)
    

    # speed
    if p2!=[]:

        surface=calculate_surface(img, bbox_cv2)
        scale=calculate_scale(surface)
        #Calculate the speed in pixels
        speed=round(calculate_speed(p1,p2,scale))
        #output the speed 
        text_s=str(speed) "km/h"
        cv2.putText(img,text_s,(left,top-10), font, font_size, font_color, 1, cv2.LINE_AA)

    # Output the labels that show the x and y coordinates of the bounding box center.
    
    #text_x= 'x=' str((left right)/2)
    #cv2.putText(img,text_x,(left,top-25), font, font_size, font_color, 1, cv2.LINE_AA)
    #text_y= 'y=' str((top bottom)/2)
    #cv2.putText(img,text_y,(left,top-5), font, font_size, font_color, 1, cv2.LINE_AA)  
##sagem begin

p2=p1

##sagem end
return img
 

Комментарии:

1. пожалуйста, используйте код (текст) вместо картинок. также максимально уменьшите проблему.

2. если у этого p2 есть значение know, вы можете передать его в качестве своего аргумента

3. также спросите себя, какое значение должен иметь этот p2 в самый первый раз, если то, что он представляет, является предыдущим известным местоположением

4. значение p2 должно быть предыдущим значением p1, если я объявляю внутри функции, p2 будет повторно инициализирован при выполнении функции, и если я объявлю его вне функции, оно будет неизвестно, и у меня будет ошибка