Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
13 kB
1
Indexable
Never
import tkinter as tk
from PIL import ImageTk, Image  
from tkinter import filedialog as fd
from tkinter.messagebox import showinfo
import cv2
import dlib
import time
import threading
import math
import xlsxwriter
from datetime import datetime
import os
import shutil
from zipfile import ZipFile
from tkinter import *
from PIL import ImageTk, Image 
import tkinter
from tkinter import *
from PIL import Image, ImageTk


# Create a workbook and add a worksheet.


class Application(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.configure(background="#A2A2CD")
app = Application()
app.geometry("1300x600")
image1 = Image.open("police.png")
image1 = image1.resize((1100, 450), Image.ANTIALIAS)
test = ImageTk.PhotoImage(image1)



my_label = Label(app,image=test)
my_label.place(x=0,y=0, relwidth=1,relheight=1)

app.title("Smart Traffic Admin Panel")
WIDTH = 640
HEIGHT = 480

def overspeeding():
    file = "sss.mp3"
    os.system(file)
    os.remove(file)

speedlimit = 100

def startproject(inputfilename):
    
    
    carCascade = cv2.CascadeClassifier('myhaar.xml')
    video = cv2.VideoCapture(inputfilename)
    

    global WIDTH
    global HEIGHT
    global speedlimit


    def estimateSpeed(location1, location2):
        d_pixels = math.sqrt(math.pow(location2[0] - location1[0], 2) + math.pow(location2[1] - location1[1], 2))
        # ppm = location2[2] / carWidht
        ppm = 8.8
        d_meters = d_pixels / ppm
        #print("d_pixels=" + str(d_pixels), "d_meters=" + str(d_meters))
        fps = 18
        speed = d_meters * fps * 3.6
        return speed
        

    def trackMultipleObjects():
        rectangleColor = (0, 255, 0)
        frameCounter = 0
        currentCarID = 0
        fps = 0
        
        carTracker = {}
        carNumbers = {}
        carLocation1 = {}
        carLocation2 = {}
        speed = [None] * 1000
        
        # Write output to video file
        out = cv2.VideoWriter('outpy.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (WIDTH,HEIGHT))
        now = datetime.now()
        workbook = xlsxwriter.Workbook('Stats.xlsx')
        worksheet = workbook.add_worksheet()
        row = 0
        column = 0
        worksheet.write(row, column, "Car ID")
        worksheet.write(row, column+1, "Status")
        worksheet.write(row, column+2, "Speed")
        worksheet.write(row, column+3, "Date and time")
        worksheet.write(row, column+4, "Car Type")
        row+=1
        
        

        


        while True:
            start_time = time.time()
            rc, image = video.read()
            if type(image) == type(None):
                break
            
            image = cv2.resize(image, (WIDTH, HEIGHT))
            resultImage = image.copy()
            
            frameCounter = frameCounter + 1
            
            carIDtoDelete = []

            for carID in carTracker.keys():
                trackingQuality = carTracker[carID].update(image)
                
                if trackingQuality < 7:
                    carIDtoDelete.append(carID)
                    
            for carID in carIDtoDelete:
                print ('Removing carID ' + str(carID) + ' from list of trackers.')
                print ('Removing carID ' + str(carID) + ' previous location.')
                print ('Removing carID ' + str(carID) + ' current location.')
                carTracker.pop(carID, None)
                carLocation1.pop(carID, None)
                carLocation2.pop(carID, None)
            
            if not (frameCounter % 10):
                gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
                cars = carCascade.detectMultiScale(gray, 1.1, 13, 18, (24, 24))
                
                for (_x, _y, _w, _h) in cars:
                    x = int(_x)
                    y = int(_y)
                    w = int(_w)
                    h = int(_h)
                
                    x_bar = x + 0.5 * w
                    y_bar = y + 0.5 * h
                    
                    matchCarID = None
                
                    for carID in carTracker.keys():
                        trackedPosition = carTracker[carID].get_position()
                        
                        t_x = int(trackedPosition.left())
                        t_y = int(trackedPosition.top())
                        t_w = int(trackedPosition.width())
                        t_h = int(trackedPosition.height())
                        
                        t_x_bar = t_x + 0.5 * t_w
                        t_y_bar = t_y + 0.5 * t_h
                    
                        if ((t_x <= x_bar <= (t_x + t_w)) and (t_y <= y_bar <= (t_y + t_h)) and (x <= t_x_bar <= (x + w)) and (y <= t_y_bar <= (y + h))):
                            matchCarID = carID
                    
                    if matchCarID is None:
                        print ('Creating new tracker ' + str(currentCarID))
                        
                        tracker = dlib.correlation_tracker()
                        tracker.start_track(image, dlib.rectangle(x, y, x + w, y + h))
                        
                        carTracker[currentCarID] = tracker
                        carLocation1[currentCarID] = [x, y, w, h]

                        currentCarID = currentCarID + 1
                        
                        
            
            #cv2.line(resultImage,(0,480),(1280,480),(255,0,0),5)


            for carID in carTracker.keys():
                trackedPosition = carTracker[carID].get_position()
                        
                t_x = int(trackedPosition.left())
                t_y = int(trackedPosition.top())
                t_w = int(trackedPosition.width())
                t_h = int(trackedPosition.height())
                
                cv2.rectangle(resultImage, (t_x, t_y), (t_x + t_w, t_y + t_h), rectangleColor, 4)
                
                # speed estimation
                carLocation2[carID] = [t_x, t_y, t_w, t_h]
            
            end_time = time.time()
            
            if not (end_time == start_time):
                fps = 1.0/(end_time - start_time)
            
            #cv2.putText(resultImage, 'FPS: ' + str(int(fps)), (620, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)


            for i in carLocation1.keys():   
                if frameCounter % 1 == 0:
                    [x1, y1, w1, h1] = carLocation1[i]
                    [x2, y2, w2, h2] = carLocation2[i]
            
                    # print 'previous location: ' + str(carLocation1[i]) + ', current location: ' + str(carLocation2[i])
                    carLocation1[i] = [x2, y2, w2, h2]
            
                    # print 'new previous location: ' + str(carLocation1[i])
                    if [x1, y1, w1, h1] != [x2, y2, w2, h2]:
                        if (speed[i] == None or speed[i] == 0) and y1 >= 275 and y1 <= 285:
                            speed[i] = estimateSpeed([x1, y1, w1, h1], [x2, y2, w2, h2])

                        #if y1 > 275 and y1 < 285:
                        if speed[i] != None and y1 >= 180:
                            if int(speed[i])>speedlimit:
                                cv2.putText(resultImage, str(int(speed[i])) + f" km/hr", (int(x1 + w1/2), int(y1-5)),cv2.FONT_HERSHEY_SIMPLEX, 0.75, (49, 49, 232), 2)
                                cv2.putText(resultImage, f"CAR ID {currentCarID} Status : OVERSPEEDING", (int(x1 + w1/4), int(y1-50)),cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), 2)
                                dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
                                worksheet.write(row, column, f"{currentCarID}")
                                worksheet.write(row, column+1, "OverSpeeding")
                                worksheet.write(row, column+2, str(int(speed[i]))+" Km/h")
                                worksheet.write(row, column+3, f"{dt_string}")
                                worksheet.write(row, column+4, "Sedan")
                                row+=1
                                try:
                                    overspeeding()
                                except:
                                    a = 1
                                
                                


                            else:
                                cv2.putText(resultImage, str(int(speed[i])) + " km/hr", (int(x1 + w1/2), int(y1-5)),cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), 2)
                                cv2.putText(resultImage, f"CAR ID {currentCarID} Status : Normal", (int(x1 + w1/4), int(y1-50)),cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), 2)
                        
                        #print ('CarID ' + str(i) + ': speed is ' + str("%.2f" % round(speed[i], 0)) + ' km/h.\n')

                        #else:
                        #   cv2.putText(resultImage, "Far Object", (int(x1 + w1/2), int(y1)),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

                            #print ('CarID ' + str(i) + ' Location1: ' + str(carLocation1[i]) + ' Location2: ' + str(carLocation2[i]) + ' speed is ' + str("%.2f" % round(speed[i], 0)) + ' km/h.\n')
            cv2.imshow('result', resultImage)
            # Write the frame into the file 'output.avi'
            #out.write(resultImage)


            if cv2.waitKey(33) == 27:
                break
        
        cv2.destroyAllWindows()
        workbook.close()
        with ZipFile("temp.zip", 'r') as zObject:
            zObject.extractall()
        

    if __name__ == '__main__':
        trackMultipleObjects()


# image1 = Image.open("zwz.png")
# image1 = image1.resize((300, 300), Image.ANTIALIAS)
# test = ImageTk.PhotoImage(image1)

# label1 = tk.Label(image=test)
# label1.image = test

# # Position image
# label1.place(x=10, y=10)

def setresolution(x,y):
    global WIDTH
    global HEIGHT
    WIDTH = x
    HEIGHT = y
    showinfo(
        title='Screen size updated',
        message=f"Screen Size updated to  {x} X {y}"
    )


def updarespeedlimit():
   global entry
   userspeedlimit = entry.get()
   speedlimit = int(userspeedlimit)
   showinfo(
        title='Speed Limit updated',
        message=f"New speed limit was set to {speedlimit} KM/H"
    )


#Initialize a Label to display the User Input
label=Label(app, text="", font=("Courier 22 bold"))
label.pack()

#Create an Entry widget to accept User Input
entry= Entry(app, width= 20)
entry.focus_set()
entry.place(x=560,y=440)

#Create a Button to validate Entry Widget
setspeed = tk.Button(app, text= "Set Speed Limit",background="#0000B2",font=('Articulat CF Extra Bold Oblique', 18, 'bold'),width= 16, command= updarespeedlimit)
setspeed.place(x=500,y=491)

setwindowhighquality = tk.Button(app, text= "1280",background="#0000B2",font=('Articulat CF Extra Bold Oblique', 21, 'bold'),width= 8, command= lambda: setresolution(1280,720))
setwindowhighquality.place(x=160,y=191)
setwindowhighquality = tk.Button(app, text= "720",background="#0000B2",font=('Articulat CF Extra Bold Oblique', 21, 'bold'),width= 8, command= lambda: setresolution(720,480))
setwindowhighquality.place(x=320,y=191)
setwindowhighquality = tk.Button(app, text= "560",background="#0000B2",font=('Articulat CF Extra Bold Oblique', 21, 'bold'),width= 8, command= lambda: setresolution(576,360))
setwindowhighquality.place(x=160,y=290)
setwindowhighquality = tk.Button(app, text= "480",background="#0000B2",font=('Articulat CF Extra Bold Oblique', 21, 'bold'),width= 8, command= lambda: setresolution(480,240))
setwindowhighquality.place(x=320,y=290)
def saverecs():
    showinfo(
        title='Record Files Saved',
        message="Speeding Files saved to stats.xlsx"
    )
SaveRecords = tk.Button(app, text= "Save Speeding Records",background="#0000B2",font=('Articulat CF Extra Bold Oblique', 21, 'bold'),width= 20, command= saverecs)
SaveRecords.place(x=140,y=360)














ProjectTitle = tk.Label(text='ADMIN PANEL',background="#0000B2",     font=('Articulat CF Extra Bold Oblique', 25, 'bold'))
ProjectTitle.place(x=730,y=32)

Projectname = tk.Label(text='AI SMART TRAFFIC MONITORING',background="#0000B2", font=('Articulat CF Extra Bold Oblique', 18, 'bold'))
Projectname.place(x=640,y=110)

setwindowsizelabel = tk.Label(text='Set Operation size',background="#0000B2", font=('Articulat CF Extra Bold Oblique', 18, 'bold'))
setwindowsizelabel.place(x=210,y=110)


def select_file():
    filetypes = (
        ('text files', '*.mp4'),
        ('All files', '*.*')
    )

    filename = fd.askopenfilename(
        title='Open a file',
        initialdir='/',
        filetypes=filetypes)
    print(filename)
    showinfo(
        title='Selected File',
        message=filename
    )
    startproject(filename)


# open button




startimage = Image.open("start.png")
startimage = startimage.resize((300, 100), Image.ANTIALIAS)
sratbut = ImageTk.PhotoImage(startimage)

b4=tk.Button(app,command=select_file,image=sratbut,bd=0,bg='#0000B2',activebackground='#000064')
b4.place(x=800,y=440)
app.mainloop()