def main(): ot = object_tracker() is_init_frame = True # Flag is necessary to setup object tracking properly prev_frame_objects = [] cur_frame_objects = [] font = cv2.FONT_HERSHEY_SIMPLEX # OpenCV font for drawing text on frame crash_flag = False vid = cv2.VideoCapture('./data/video/' + name + '.mp4') # 28, 26, 30 (mTracker güzel test) vid.set(1, saniye) # İlk Frame al # tracker başlat # mTracker = cv2.TrackerMOSSE_create() # _, img = vid.read() # tbox = cv2.selectROI("Tracking", img, False) # mTracker.init(img, tbox) codec = cv2.VideoWriter_fourcc(*'XVID') vid_fps = int(vid.get(cv2.CAP_PROP_FPS)) vid_width, vid_height = int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)), int( vid.get(cv2.CAP_PROP_FRAME_HEIGHT)) out = cv2.VideoWriter('./data/video/results.avi', codec, vid_fps, (vid_width, vid_height)) #kuyruk deque'si pts = [deque(maxlen=300) for _ in range(1000)] pts_index = 0 counter = 0 isBboxesFilled = False # yolo'nun sounç verdiği ilk kareyi tespit etmek için kullandık. listX_prev = [-1] * 50 listY_prev = [-1] * 50 while True: t1 = time.time() counter = counter + 1 print(counter) _, img = vid.read() if img is None: print('Completed') break # sadece bir kere çalışır if counter == 1 or isBboxesFilled == False: bboxes = get_bboxes(img) # yolo # p.print("bboxes\n" + str(bboxes)) # List'in içi dolu if bboxes: isBboxesFilled = True # convertedBboxes = [] # for bbox in bboxes: # w = (bbox[2] - bbox[0]) # h = (bbox[3] - bbox[1]) # convertedBbox = [bbox[0], bbox[1], w, h] # convertedBboxes.append(convertedBbox) convertedBboxes = expand_bboxes(tlbr_to_xywh(bboxes), .3) multiTracker_add(img, convertedBboxes) # multiTracker.clear() # 7 karede bir yolo çalıştır, takibi tekrar başlat # if counter % 7 == 0: # multiTracker_reset() # bboxes = get_bboxes(img) # yolo # multiTracker_add(img, expand_bboxes(tlbr_to_xywh(bboxes), .3)) # multitracker'ın takip ettiği araçların konumlarını yenile success, tboxes = multiTracker.update(img) # ardışık kareler aynıysa ikincisini kontrol etme # if center[0] == x_prev and center[1] == y_prev: # continue # x_prev = center[0] # y_prev = center[1] isFrameSame = True for i, tbox in enumerate(tboxes): center = getTboxCenter(tbox) # en az bir aracın konumunu farklı tespit ederse if not (center[0] == int(listX_prev[i]) and center[1] == int(listY_prev[i])): isFrameSame = False listX_prev[i] = center[0] listY_prev[i] = center[1] if isFrameSame: counter -= 1 p.print("GELDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII") continue # tbox çiz for i, tbox in enumerate(tboxes): #tbox x1, y1, w, h # p1 = (int(tbox[0]), int(tbox[1])) # p2 = (int(tbox[0] + tbox[2]), int(tbox[1] + tbox[3])) center = getTboxCenter(tbox) # kuyruk çiz (kullanıyoruz), center noktasını pts dizisine ekle pts[pts_index].append(center) # pts.length kadar dön ve kırmızı nokta çiz (geçmiş karelerdeki noktaları da çizer) for j in range(1, len(pts[pts_index])): if pts[pts_index][j - 1] is None or pts[pts_index][j] is None: continue cv2.circle(img, pts[pts_index][j], 1, (0, 0, 255), 4) p1 = getTboxTopLeft(tbox) p2 = getTboxBottomRight(tbox) print(tbox[0], tbox[1], tbox[2], tbox[3]) # cv2.rectangle(img, (int(tbox[0]),int(tbox[1])), (int(tbox[0]) + int(tbox[2]), int(tbox[1]) + int(tbox[3])), (204, 235, 52), 2, 1) # p1-solüst(x1, y1) p2-sağ alt(x2, y2) cv2.rectangle(img, p1, p2, (204, 235, 52), 2, 1) # p1-solüst(x1, y1) p2-sağ alt(x2, y2) # RAGHAV'A CENTER'LARI VER for tbox in tboxes: center = getTboxCenter(tbox) # track_id => sürekli artıyor sınırsız şekilde, yavaş yavaş artıyor # Tek frame'deki tüm araç center'larını depola if ( is_init_frame == True ): # ilk frame ise araçların center'larını cur yerine prev'in içine doldur. prev_frame_objects.append([(center[0], center[1]), ot.get_init_index(), 0, deque(), -1, 0]) else: # her frame de içi tekrar dolduruluyor cur_frame_objects.append([(center[0], center[1]), 0, 0, deque(), -1, 0]) # (her frame için bir kere döner) if (is_init_frame == False): # We only run when we have had at least 1 object detected in the previous (initial) frame # prev boş olursa hiç bir cur eşlenemeyeceği için böyle bi kontrol var if (len(prev_frame_objects) != 0): # cur'un center dışındaki tüm parametre verilerini doldurur cur_frame_objects = ot.sort_cur_objects( prev_frame_objects, cur_frame_objects) # p.print(cur_frame_objects) # for car in cur_frame_objects: # cv2.putText(img, str(car[1]), car[0], 0, 1, (0,0,255), 2) # FPS hesapla fps = 1. / (time.time() - t1) cv2.putText(img, "FPS: {:.2f}".format(fps), (0, 30), 0, 1, (0, 0, 255), 2) cv2.resizeWindow('output', 1024, 768) # cv2.imshow('output', img) ##################################### # out.write(img) # 0 1 2 3 4 5 # point => [(center[0], center[1]), 0, 0, deque(), -1, 0] # 0: center koordinatları # 1: id # 2: obje kaç frame'dir tespit ediliyor # 3: deque # 4: (eşlenme verisi) herhangi bir prev obj ile eşlenip eşlenmediği verisi (yada eşleşmiş olduğu obj'nin indexi olabilir) # 5: Magnitude of object (PREVIOUS FRAME) is_crash_detected = False # Has a crash been detected anywhere in our current frame? for i, point in enumerate( cur_frame_objects ): # Iterating through all our objects in the current frame. # Only objects that have been present for 5 consecutive frames are considered. This is done to # filter out any inaccurate momentary detections. if (point[2] >= 5): # obje 5 kareden fazladır tespit ediilyorsa # Örnek deque => deque([(421, 293), (422, 293), (425, 296), (426, 296), (426, 297)]) # point[3][-1][0] => objenin dequesisnin son elemanının x değeri # point[3][0][0] => objenin dequesisnin ilk elemanının x değeri # point[3][-1][1] => objenin dequesinin son elemanının y değeri # point[3][0][1] => objenin dequesinin ilk elemanının y değeri # vector => 5 karedeki x farkı, 5 karedeki y farkı # vector[0] => 5 karedeki x farkı # vector[1] => 5 karedeki y farkı # Finding vector of object across 5 vector = [ point[3][-1][0] - point[3][0][0], point[3][-1][1] - point[3][0][1] ] # Getting a simple estimate coordinate of where we expect our object to end up # with its current vector. This is used to draw the predicted vector for each object. # end_point => x farkı * 2 + cur'un son x değeri, y farkı * 2 + cur'un son y değeri # mevcut konum + son 5 karedeki değişim end_point = (2 * vector[0] + point[3][-1][0], 2 * vector[1] + point[3][-1][1]) # Getting magnitude of vector for crash detection. We could use the direction in this detection # as well, but we achieved much better results when just using the magnitude. # vector[0] = son 5 karedeki x farkı # vector[1] = son 5 karedeki y farkı # vector_mag = son 5 karedeki konum farkı (piksel bazlı) vector_mag = (vector[0]**2 + vector[1]**2)**(1 / 2) # Change in magnitude (essentially the object's acceleration/deceleration) # vector_mag => (mevcut kare, mecvut kare-5) yer değiştirme # point[5] => (previous kare, previous kare-5) yer değiştirme # delta = araç ivmesi delta = abs(vector_mag - point[5]) #bbox = point[] cv2.putText(img, str("ivme: " + "{:.2f}".format(delta)), (int(tboxes[i][0]), int(tboxes[i][1] - 20)), font, 1, (235, 55, 55), 2, cv2.LINE_AA) # Flag for current object being a crash or not. has_object_crashed = False if (delta >= 11) and point[5] != 0.0: # Criteria for crash. is_crash_detected = True has_object_crashed = True # Drawing circle to label detected objects cv2.circle(img, point[0], 5, (0, 255, 255), 2) #draw_frame if (has_object_crashed == True): # Red circle is drawn around an object that has been suspected of crashing cv2.circle(img, point[0], 40, (0, 0, 255), 4) #draw_frame # Drawing predicted future vector of each object. (Blue line) # Vektör çizgisini çiz cv2.line(img, point[3][-1], end_point, (255, 255, 0), 2) #draw_frame if (is_crash_detected == True): #cv2.putText(img, f"CRASH DETECTED", (0, 30), font, 1, (0, 0, 255), 2, cv2.LINE_AA) #draw_frame p.print(" KAZA OLDUUUUUUUUUUUUUUUUUUUUUUUUUUU ") crash_flag = True cv2.putText(img, f"CRASH DETECTED", (300, 300), font, 1, (0, 0, 255), 2, cv2.LINE_AA) #draw_frame if crash_flag == True: cv2.putText(img, f"CRASH DETECTED", (300, 30), font, 1, (0, 0, 255), 2, cv2.LINE_AA) #draw_frame if (is_init_frame == False): # ilk frame değil ise prev_frame_objects = cur_frame_objects.copy() # prev = cur cur_frame_objects = [] # cur = [] is_init_frame = False cv2.imshow('Tracking', img) # yavaş # time.sleep(0.8) # orta yavaş # time.sleep(0.5) # orta hızlı # time.sleep(0.3) # hızlı time.sleep(0.15) # orta hızlı # time.sleep(0.10) # çok hızlı # time.sleep(0.05) if cv2.waitKey(1) == ord('q'): break vid.release() out.release() cv2.destroyAllWindows()
#süre saniye = ((0 * 60) + 0) * 30 + 10 name = "2" mod_var = 0 mod_flag = 0 import time, sys, cv2, matplotlib.pyplot as plt, numpy as np from MY_print_methods import print_class from RAGHAV_object_tracker import object_tracker from _collections import deque p = print_class() ot = object_tracker() is_init_frame = True # Flag is necessary to setup object tracking properly prev_frame_objects = [] cur_frame_objects = [] font = cv2.FONT_HERSHEY_SIMPLEX # OpenCV font for drawing text on frame crash_flag = False # isim vid = cv2.VideoCapture('./data/video/' + name + '.mp4') # 28, 26, 30 (opencv_tracker güzel test) # vid.set(cv2.CAP_PROP_FPS, 1) vid.set(1, saniye) # tracker başlat # opencv_tracker = cv2.TrackerMIL_create()