import cv2 import numpy as np import json from pysolar.solar import * from datetime import datetime from flask import Flask, request from flask_restful import Resource, Api, abort import base64 import pickle from PIL import Image from matplotlib import pyplot as plt from io import BytesIO app = Flask(__name__) api = Api(app) def generateAvg(locs, img, avgs): time = datetime.strptime( "2019-04-27 17:52:00 -0300","%Y-%m-%d %H:%M:%S %z") altitude = int(get_altitude(39.9127938,32.8073577,time)) loc_images = {} for i in locs: temp = locs[i] crop_img = img[temp["y1"]:temp["y2"], temp["x1"]:temp["x2"]] loc_images[i]=[crop_img] vals = {} if str(altitude) in avgs: vals = avgs[str(altitude)] else: for spot in loc_images: vals[spot] = loc_images[spot] for spot in loc_images: for col in range(len(vals[spot][0])): for pix in range(len(vals[spot][0][col])): vals[spot][0][col][pix] = [ np.uint8((int(vals[spot][0][col][pix][0]) + int(loc_images[spot][0][col][pix][0]))/2), np.uint8((int(vals[spot][0][col][pix][1]) + int(loc_images[spot][0][col][pix][1]))/2), np.uint8((int(vals[spot][0][col][pix][2]) + int(loc_images[spot][0][col][pix][2]))/2)] for i in vals: vals[i] = vals[i][0].tolist() avgs[altitude] = vals return avgs def generateData(locs, img, avgs,show): time = datetime.strptime( "2019-04-27 17:52:00 -0300","%Y-%m-%d %H:%M:%S %z") altitude = int(get_altitude(39.9127938,32.8073577,time)) loc_images = {} distances = {} for i in locs: temp = locs[i] crop_img = img[temp["y1"]:temp["y2"], temp["x1"]:temp["x2"]] loc_images[i]=[crop_img] vals = {} if str(altitude) in avgs: for spot in avgs[str(altitude)]: vals[spot] = np.array(avgs[str(altitude)][spot]) else: for spot in loc_images: vals[spot] = loc_images[spot] for spot in loc_images: foo = np.zeros((len(vals[spot]),len(vals[spot][0])),dtype=int) distances[spot] = 0 for col in range(len(vals[spot])): for pix in range(len(vals[spot][col])): vals[spot][col][pix] = [ np.uint8(abs(int(vals[spot][col][pix][0]) - int(loc_images[spot][0][col][pix][0]))), np.uint8(abs(int(vals[spot][col][pix][1]) - int(loc_images[spot][0][col][pix][1]))), np.uint8(abs(int(vals[spot][col][pix][2]) - int(loc_images[spot][0][col][pix][2])))] distances[spot] += np.sum(vals[spot][col][pix]) foo[col][pix] = np.max(vals[spot][col][pix]) distances[spot] = int(distances[spot]/vals[spot].size) vals[spot] = foo if spot in show: plt.imshow(vals[spot], interpolation='nearest') #plt.show() return distances def im2str(im): imdata = pickle.dumps(im) return base64.b64encode(imdata).decode('ascii') plt.axis("off") with open("modules/databases/locations.json","r") as f: locs = json.loads(f.read()) with open("modules/databases/park_data.json","r") as f: data = json.loads(f.read()) cam = cv2.VideoCapture(5) if 1: ret,im = cam.read() data = generateAvg(locs,im,data) with open("modules/databases/park_data.json","w") as f: f.write(json.dumps(data,indent=2)) class Empty(Resource): def get(self): image = cv2.imread("modules/lot.jpg") backup = image.copy() spot_data = generateData(locs,image,data,["0","1","2"]) print(spot_data) best_spot = -1 for loc in spot_data: spot_data[loc] = spot_data[loc] < 30 color = (0,255*spot_data[loc],255*(not spot_data[loc])) cv2.rectangle(image,(locs[loc]["x1"],locs[loc]["y1"]),(locs[loc]["x2"],locs[loc]["y2"]),color,5) if spot_data[loc]: if best_spot == -1: best_spot = loc continue if locs[loc]["priority"] < locs[best_spot]["priority"]: best_spot = loc print(spot_data) if best_spot == -1: print("Sorry, no spot found :(") return else: print("Empty spot found at {}".format(int(best_spot) + 1)) foo = locs[best_spot] crop_img = backup[foo["y1"]:foo["y2"], foo["x1"]:foo["x2"]].copy(order='C') crop_img = Image.fromarray(crop_img,"RGB") buffered = BytesIO() crop_img.save(buffered, format="JPEG") img = base64.b64encode(buffered.getvalue()).decode("ascii") return {"lat":foo["lat"], "lng":foo["lng"], "img":img}