Beispiel #1
0
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()