import xml.etree.ElementTree as ET
|
|
import cv2
|
|
import numpy as np
|
|
import os
|
|
import json
|
|
from pysolar.solar import *
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
def timeAverage():
|
|
data_file = open("data.json","r")
|
|
time_file = open("timely.json","w")
|
|
averages = json.loads(data_file.read())
|
|
timely = {}
|
|
altitudes = {}
|
|
for key in averages:
|
|
date = key[37:-13]
|
|
time = key[49:-4].replace("_",":")
|
|
averages[key]["time"]=time
|
|
averages[key]["date"]=date
|
|
|
|
data_file.close()
|
|
data_file = open("data.json","w")
|
|
data_file.write(json.dumps(averages))
|
|
for key in averages:
|
|
time = datetime.strptime(averages[key]["date"] + " " + averages[key]["time"] + " -0300","%Y-%m-%d %H:%M:%S %z")
|
|
altitude = int(get_altitude(-25.4269081,-49.3318036,time))
|
|
altitudes[averages[key]["date"] + " " + averages[key]["time"] ] = altitude
|
|
if not (altitude in timely):
|
|
timely[altitude] = {}
|
|
for spot in averages[key]:
|
|
if(spot == "time" or spot == "date"):
|
|
continue
|
|
if not spot in timely[altitude]:
|
|
timely[altitude][spot]=[]
|
|
timely[altitude][spot].append({"r":averages[key][spot]["r"],"b":averages[key][spot]["b"],"g":averages[key][spot]["g"]})
|
|
print(altitudes)
|
|
for key in timely:
|
|
|
|
for id in timely[key]:
|
|
total = {"r":0,"g":0,"b":0}
|
|
for i in range(len(timely[key][id])):
|
|
for color in total:
|
|
total[color] += timely[key][id][i][color]
|
|
|
|
for color in total:
|
|
total[color] = total[color] / len(timely[key][id])
|
|
|
|
timely[key][id] = total
|
|
print(timely)
|
|
timely_json = json.dumps(timely)
|
|
time_file.write(timely_json)
|
|
|
|
data_file.close()
|
|
time_file.close()
|
|
|
|
|
|
def generateData(locations,image,show,averages):
|
|
|
|
loc_images = {}
|
|
average_values = {}
|
|
average_total=[0,0,0]
|
|
|
|
for col in range(len(image)):
|
|
for pix in range(len(image[col])):
|
|
if (image[col][pix] == [255,255,255]).all():
|
|
image[col][pix] == [255,255,254]
|
|
|
|
for i in locations:
|
|
temp = locations[i]
|
|
|
|
pts = np.array([[int(temp[0]['x']),int(temp[0]['y'])],
|
|
[int(temp[1]['x']),int(temp[1]['y'])],
|
|
[int(temp[2]['x']),int(temp[2]['y'])],
|
|
[int(temp[3]['x']),int(temp[3]['y'])]])
|
|
|
|
rect = cv2.boundingRect(pts)
|
|
x,y,w,h = rect
|
|
croped = image[y:y+h, x:x+w].copy()
|
|
|
|
pts = pts - pts.min(axis=0)
|
|
|
|
mask = np.zeros(croped.shape[:2], np.uint8)
|
|
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
|
|
|
|
dst = cv2.bitwise_and(croped, croped, mask=mask)
|
|
bg = np.ones_like(croped, np.uint8)*255
|
|
cv2.bitwise_not(bg,bg, mask=mask)
|
|
dst2 = bg+ dst
|
|
|
|
split_len = len(dst2)//3
|
|
|
|
splitted = [dst2[:split_len,:],dst2[split_len:split_len*2,:],dst2[split_len*2:,:]]
|
|
|
|
loc_images[i]=[dst2]
|
|
|
|
|
|
|
|
for lot in loc_images:
|
|
average_values[lot] = []
|
|
|
|
for i in range(1):
|
|
diff_pix = 0
|
|
reps = 0
|
|
avg_rgb = [0,0,0]
|
|
rgb = ["b","g","r"]
|
|
for col in loc_images[lot][i]:
|
|
for pix in col:
|
|
if (pix == [255,255,255]).all():
|
|
continue
|
|
different = False
|
|
print("[",end="")
|
|
for j in range(3):
|
|
print(abs(int(averages[lot][rgb[i]]-pix[i])) , end=",")
|
|
if abs(averages[lot][rgb[i]]-pix[i]) > 59:
|
|
different = True
|
|
reps += 1
|
|
diff_pix += different
|
|
print("]",end=" ")
|
|
print("")
|
|
|
|
print("\n\n")
|
|
|
|
average_values[lot] = (diff_pix/reps)*100
|
|
if lot in show:
|
|
cv2.imshow("a" , loc_images[lot][0])
|
|
cv2.waitKey(0)
|
|
return average_values
|
|
|
|
|
|
def findSpot(img_loc,locations):
|
|
empty = []
|
|
timely_values = time_file = open("timely.json","r")
|
|
timely_averages = json.loads(timely_values.read())
|
|
img = cv2.imread(img_loc)
|
|
|
|
date = img_loc[37:-13]
|
|
time = img_loc[49:-4]
|
|
time = time.replace("_",":")
|
|
|
|
time = datetime.strptime(date + " " + time + " -0300","%Y-%m-%d %H:%M:%S %z")
|
|
altitude = int(get_altitude(-25.4269081,-49.3318036,time))
|
|
base_value = timely_averages[str(altitude)]
|
|
print(altitude)
|
|
averages = generateData(locations,img,[],base_value)
|
|
|
|
for i in averages:
|
|
print(i + " " + str(averages[i]))
|
|
|
|
for i in locations:
|
|
if(averages[i] > 32):
|
|
color=[0,0,255]
|
|
empty.append(i)
|
|
else:
|
|
color=[0,255,0]
|
|
corners = [[],[]]
|
|
for j in range(0,4):
|
|
val2 = j+1
|
|
if(val2 == 4):
|
|
val2 = 0
|
|
pt1 = (int(locations[i][j]["x"]),int(locations[i][j]["y"]))
|
|
pt2 = (int(locations[i][val2]["x"]),int(locations[i][val2]["y"]))
|
|
cv2.line(img,pt1,pt2,color)
|
|
corners[0].append(int(locations[i][j]["x"]))
|
|
corners[1].append(int(locations[i][j]["y"]))
|
|
|
|
x1=min(corners[0][0],corners[0][1],corners[0][2],corners[0][3]);
|
|
x2=max(corners[0][0],corners[0][1],corners[0][2],corners[0][3]);
|
|
y1=min(corners[1][0],corners[1][1],corners[1][2],corners[1][3]);
|
|
y2=max(corners[1][0],corners[1][1],corners[1][2],corners[1][3]);
|
|
|
|
pt = (int((x1+x2)/2),int((y1+y2)/2))
|
|
|
|
cv2.putText(img,str(i), pt, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 255)
|
|
|
|
|
|
cv2.imshow("Parking Lot",img)
|
|
cv2.waitKey(0)
|
|
return empty
|
|
|
|
location_file = open("locations.json","r")
|
|
location_json = json.loads(location_file.read())
|
|
empty_locs = findSpot('./PKLot/PKLot/PUCPR/Sunny/2012-09-11/2012-09-11_18_08_41.jpg',location_json)
|
|
closest = 1000
|
|
for i in empty_locs:
|
|
print (location_json[i][4])
|
|
if location_json[i][4] < closest:
|
|
closest = int(i)
|
|
|
|
print("The closest spot is " + str(closest))
|
|
print("done")
|
|
|
|
|
|
|