demo1 / app.py
imaneralo's picture
Update app.py
c0a3be3 verified
raw
history blame
9.3 kB
import numpy as np
from ultralytics import YOLO
import cv2
import cvzone
import math
from sort import *
import datetime
import geocoder
import gradio as gr
#i want to take co ordinates in lat long of this device
# def get_coordinates():
# g = geocoder.ip('me')
# if g.latlng:
# return {'lat': str(g.latlng[0]), 'long': str(g.latlng[1])}
# else:
# return None
# currentCoordinates = get_coordinates()
# if currentCoordinates:
# print(currentCoordinates)
# else:
# print("Unable to get device coordinates.")
#calculate distance b/w two coordinates
def distance_calculations(stationFromCoordinates, stationToCoordinates):
stationFromCoordinates = {'lat': ' 28.98', 'long': '77.7064'}
stationToCoordinates = {'lat': '28.66', 'long': '77.22'}
lat1 = float(stationFromCoordinates['lat'])
lon1 = float(stationFromCoordinates['long'])
lat2 = float(stationToCoordinates['lat'])
lon2 = float(stationToCoordinates['long'])
R = 6371
dlat = math.radians(lat2 - lat1)
dlon = math.radians(lon2 - lon1)
a = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
distance = R * c
return distance
print(distance_calculations({'lat': ' 28.98', 'long': '77.7'}, {'lat': '28.66', 'long': '77.22'}))
totalFare=0
pricePerKm=1.5
def distanceCalculations(inBetweenDepaturePoints,inBetweenOnBoardingPoints):
print(inBetweenDepaturePoints,inBetweenOnBoardingPoints ,'inbetween points')
return 3
def fareCalculations():
global totalFare
print(dict)
index=0
for i in dict.values():
print(len(i))
inBetweenDepaturePoints=[]
inBetweenOnBoardingPoints=[]
if(len(i)>3):
print(True)
#index of the dict
print(index,"index")
print(i[0],i[1],i[2],"values of the dict","key of the dict")
if i[0]==True and i[1]==False:
inBetweenDepaturePoints.append(i[2])
if i[0]==False and i[1]==True:
inBetweenOnBoardingPoints.append(i[2])
fare=distanceCalculations(inBetweenDepaturePoints,inBetweenOnBoardingPoints)*pricePerKm
print(fare,'fare')
totalFare+=fare
index+=1
print(totalFare)
# def returnRBG(img):
# return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cap = cv2.VideoCapture('./trialFootage.mp4')
model = YOLO("./Yolo-Weights/yolov8n.pt")
stationFrom='Meerut'
stationFromCoordinates={"lat":"12.12.54.4","long":"44.36.09"} # Meerut
stationToCoordinates={'lat':'54.45.56',"long":'45.45.45'}
currentCoordinates={'lat': '28.98', 'long': '77.7064'}
stationTo='Delhi'
reachedDestination=False
ListPeople = []
dict = {}
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"Video Resolution: {width}x{height}")
classNames = ["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck", "boat",
"traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat",
"dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
"handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat",
"baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
"fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli",
"carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant", "bed",
"diningtable", "toilet", "tvmonitor", "laptop", "mouse", "remote", "keyboard", "cell phone",
"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors",
"teddy bear", "hair drier", "toothbrush"
]
# Tracking
tracker = Sort(max_age=20, min_hits=3, iou_threshold=0.3)
yelloLine = [270, 0, 270, 600]
RedLine = [173, 0, 173, 600]
totalCountUp = []
#mask=cv2.imread('mask.jpg')
entry_count = 0
total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
processed_frames = 0
try:
while True:
processed_frames+=1
if(processed_frames>=total_frames):
break
success, img = cap.read()
if not success:
break
# imgRegion=cv2.bitwise_and(img,mask)
results = model(img, stream=True)
detections = np.empty((0, 5))
for r in results:
boxes = r.boxes
for box in boxes:
# Bounding Box
x1, y1, x2, y2 = box.xyxy[0]
x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
# cv2.rectangle(img,(x1,y1),(x2,y2),(255,0,255),3)
w, h = x2 - x1, y2 - y1
# Confidence
conf = math.ceil((box.conf[0] * 100)) / 100
# Class Name
cls = int(box.cls[0])
currentClass = classNames[cls]
if currentClass == "person" and conf > 0.3:
# cvzone.putTextRect(img, f'{currentClass} {conf}', (max(0, x1), max(35, y1)),
# scale=0.6, thickness=1, offset=3)
# cvzone.cornerRect(img, (x1, y1, w, h), l=9, rt=5)
currentArray = np.array([x1, y1, x2, y2, conf])
detections = np.vstack((detections, currentArray))
resultsTracker = tracker.update(detections)
cv2.line(img, (yelloLine[0], yelloLine[1]), (yelloLine[2], yelloLine[3]), (0, 0, 255), 5)
cv2.line(img, (RedLine[0], RedLine[1]), (RedLine[2], RedLine[3]), (0, 255, 200), 5)
for result in resultsTracker:
x1, y1, x2, y2, id = result
x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
print(result)
w, h = x2 - x1, y2 - y1
cvzone.cornerRect(img, (x1, y1, w, h), l=9, rt=2, colorR=(255, 0, 255))
cvzone.putTextRect(img, f' {int(id)}', (max(0, x1), max(35, y1)),
scale=2, thickness=3, offset=10)
cx, cy = x1 + w // 2, y1 + h // 2
cv2.circle(img, (cx, cy), 5, (255, 0, 255), cv2.FILLED)
if yelloLine[0] - 20 < cx < yelloLine[2] + 20:
if totalCountUp.count(id) == 0:
totalCountUp.append(id)
dict[id] = [False]
cv2.line(img, (yelloLine[0], yelloLine[1]), (yelloLine[2], yelloLine[3]), (0, 0, 255), 5)
elif totalCountUp.count(id) == 1:
if (dict[id].count(False) < 1):
dict[id].append(False)
cv2.line(img, (yelloLine[0], yelloLine[1]), (yelloLine[2], yelloLine[3]), (0, 0, 255), 5)
if RedLine[0] - 20 < cx < RedLine[2] + 30:
if totalCountUp.count(id) == 0:
totalCountUp.append(id)
dict[id] = [True]
dict[id].append(currentCoordinates)
#adding timestamp
current_time = datetime.datetime.now()
dict[id].append(current_time)
cv2.line(img, (RedLine[0], RedLine[1]), (RedLine[2], RedLine[3]), (0, 255, 200), 5)
elif totalCountUp.count(id) == 1:
if (dict[id].count(True) < 1):
dict[id].append(True)
dict[id].append(currentCoordinates)
#adding timestamp
current_time = datetime.datetime.now()
dict[id].append(current_time)
cv2.line(img, (RedLine[0], RedLine[1]), (RedLine[2], RedLine[3]), (0, 255, 200), 5)
print(totalCountUp)
entry_count=0
for i in dict.values():
if (len(i) >= 2):
if i[0] == True and i[1] == False:
print('in true/False')
if entry_count > 0:
entry_count -= 1
if i[0] == False and i[1] == True:
print('in /False/True')
entry_count += 1
# print('count is ', entry_count)
# print(dict)
cv2.putText(img, str(entry_count), (110, 245), cv2.FONT_HERSHEY_PLAIN, 5, (50, 50, 230), 7)
print('count is ', entry_count)
print(dict)
# Create the Gradio interface
# interface = gr.Interface(
# fn=returnRBG(img),
# inputs=gr.Text("enter anything"),
# outputs="image",
# )
# cv2.waitKey(1)
print(entry_count)
# if currentCoordinates==stationToCoordinates:
# reachedDestination=True
# fareCalculations()
# dict=[]
# break
if entry_count>2:
print('reached destination')
fareCalculations()
break
except Exception as e:
print("error occured",e)