|
|
- 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")
-
-
-
|