import cv2 import math import numpy as np kBACKGROUND_NUM = 10 kSIZE = 128 kEXPONENTAL_VALUE = 0.7 gSENSOR_FOV = 60.0 / 180.0 * math.pi def exponential(img, value): tmp = cv2.pow(img.astype(np.double), value)*(255.0/(255.0**value)) return tmp.astype(np.uint8) def mergeFrames(imgs, SIZE, overlap): tmp = np.zeros((SIZE, SIZE*2-overlap), dtype=np.uint16) tmp[:, :SIZE] = imgs[0] tmp[:, -SIZE:] += imgs[1] tmp[:, (SIZE-overlap): SIZE] = tmp[:, (SIZE-overlap): SIZE]/2 tmp2 = np.zeros((SIZE, SIZE*2-overlap), dtype=np.uint16) tmp2[:, :SIZE] = imgs[2] tmp2[:, -SIZE:] += imgs[3] tmp2[:, (SIZE-overlap): SIZE] = tmp2[:, (SIZE-overlap): SIZE]/2 merge = np.zeros((SIZE*2-overlap, SIZE*2-overlap), dtype=np.uint16) merge[:SIZE, :] = tmp merge[-SIZE:, :] += tmp2 merge[(SIZE-overlap):SIZE, :] = merge[(SIZE-overlap):SIZE, :]/2 #merge = exponential(merge, kEXPONENTAL_VALUE) return merge.astype(np.uint8) class DataFuser(object): def __init__(self, sensor_dist): self.background_cnt = 0 self.background_frame = np.zeros((4, 64)) self.sensor_dist = sensor_dist def mergeFrame(self, frame, dist = None): if self.background_cnt < kBACKGROUND_NUM: self.background_frame += frame / kBACKGROUND_NUM self.background_cnt += 1 return False frame = exponential(cv2.subtract(exponential(frame, kEXPONENTAL_VALUE), exponential(self.background_frame, kEXPONENTAL_VALUE)), 0.3) print (([max(x) for x in frame])) imgs = [np.reshape(img, (8, 8)) for img in frame] imgs = [cv2.resize(img.astype(np.uint8), (kSIZE, kSIZE), interpolation = cv2.INTER_LINEAR) for img in imgs] try: overlap = int(kSIZE - kSIZE * (self.sensor_dist / (2 * dist * math.tan(gSENSOR_FOV / 2)))) except: overlap = 0 if overlap < 0: overlap = 0 overlap = 0 return mergeFrames(imgs, kSIZE, overlap) if not dist: pass