import cv2 import numpy as np import json from matplotlib import pyplot as plt import cv2 import numpy as np import json import os from matplotlib import pyplot as plt 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 calcAvg(img,locations_xml): locations_extracted = [] loc_images = {} average_values = {} for i in range( len( locations_xml ) ): try: locations_extracted.append([]) for j in range(4): locations_extracted[i].append(locations_xml[i][1][j].attrib) locations_extracted[i].append(locations_xml[i].attrib['occupied']) locations_extracted[i].append(locations_xml[i].attrib['id']) except Exception: print("xml corrupt!") return {} for col in range(len(img)): for pix in range(len(img[col])): if (img[col][pix] == [255,255,255]).all(): img[col][pix] == [255,255,254] for i in range(len(locations_extracted)): temp = locations_extracted[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 = img[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 blurred = cv2.GaussianBlur(dst2,(5,5),3) edges = cv2.Canny(blurred,100,100) if not temp[4] in loc_images: loc_images[temp[4]] = {} loc_images[temp[4]][temp[5]] = edges for state in loc_images: average_values[state] = {} for lot in loc_images[state]: reps = 0 for col in loc_images[state][lot]: for pix in col: if(pix == 255): reps += 1 average_values[state][lot] = reps print (average_values) return average_values def generateAvg(): dates = os.listdir('./PKLot/PKLot/PUCPR/Sunny') imgs = [] averages={} back_file = open("backup.json","w") back_file.write("{") for i in range(len(dates)): imgs.append(os.listdir(os.path.join('./PKLot/PKLot/PUCPR/Sunny',dates[i]))) for i in range(len(imgs)): for j in range(len(imgs[i])): if(imgs[i][j][-4:] == ".jpg"): try: img_location = os.path.join('./PKLot/PKLot/PUCPR/Sunny',dates[i],imgs[i][j]) locs = ET.parse(img_location[:-4] + ".xml").getroot() print(img_location,end=" ") average = calcAvg(cv2.imread(img_location),locs) if not(average == {}): averages[img_location] = average back_file.write("'"+img_location + "':" + str(average)) except Exception: continue back_file.write("}") js = json.dumps(averages) print(js) fp = open('data.json', 'w') fp.write(js) fp.close() generateAvg()