diff --git a/trunk/P_20190515_132230_vHDR_Auto.jpg b/trunk/P_20190515_132230_vHDR_Auto.jpg new file mode 100644 index 0000000..f0bb250 Binary files /dev/null and b/trunk/P_20190515_132230_vHDR_Auto.jpg differ diff --git a/trunk/P_20190515_142306_vHDR_Auto.jpg b/trunk/P_20190515_142306_vHDR_Auto.jpg new file mode 100644 index 0000000..e5a8806 Binary files /dev/null and b/trunk/P_20190515_142306_vHDR_Auto.jpg differ diff --git a/trunk/Slide/Meeting 05_15.pptx b/trunk/Slide/Meeting 05_15.pptx new file mode 100644 index 0000000..7ef31b5 Binary files /dev/null and b/trunk/Slide/Meeting 05_15.pptx differ diff --git a/trunk/code/body.jpg b/trunk/code/body.jpg new file mode 100644 index 0000000..1c0f42d Binary files /dev/null and b/trunk/code/body.jpg differ diff --git a/trunk/code/distanceSensor.jpg b/trunk/code/distanceSensor.jpg new file mode 100644 index 0000000..0b65a8a Binary files /dev/null and b/trunk/code/distanceSensor.jpg differ diff --git a/trunk/code/readGridEye.py b/trunk/code/readGridEye.py index d21e2f0..d90b73e 100644 --- a/trunk/code/readGridEye.py +++ b/trunk/code/readGridEye.py @@ -65,52 +65,163 @@ class GridEye(): data = [] if len(data) > 8: data.pop(0) - + +class Distance(): + def __init__(self, serialPort, baudrate): + self.port = serial.Serial(serialPort, baudrate) + self.distance = 200 + self.reading = True + self.thread = threading.Thread(target = self.reader) + self.thread.setDaemon(True) + self.lock = threading.Lock() + + def start(self): + self.port.reset_input_buffer() + self.thread.start() + + def stop(self): + self.reading = False + self.thread.join() + + def reader(self): + while (self.reading): + line = b'' + while (self.reading): + c = self.port.read() + if c == b'\r': + c = self.port.read() + break + if c == b'\n': + break + line += c + if b'Distance' in line: + try: + dist = float(line.decode('utf-8').split(':')[1]) + print (dist) + if dist > 200.0: + dist = 200.0 + self.lock.acquire() + self.distance = dist + self.lock.release() + except ValueError as e: + print ('error', e) if __name__ == '__main__': import cv2 import numpy as np + import math + def exponential(img, value): + tmp = cv2.pow(img.astype(np.double), value)*(255.0/(255.0**value)) + return tmp.astype(np.uint8) + SIZE = 128 overlap = 120 - grideye = GridEye('COM17', 115200) + AVERAGE_FRAME = 10 + distanceBetweenSensors = 7.7 #cm + distance2Object = 60.0 #cm + ADJUST_BACK = 5 + EXPONENTAL_VALUE = 0.4 + + offset = (distanceBetweenSensors / (2*distance2Object*math.tan(30.0/180.0*math.pi))) * SIZE + overlap = int(SIZE - offset) + print (overlap) + grideye = GridEye('COM15', 115200) grideye.start() - grideye2 = GridEye('COM15', 115200) + grideye2 = GridEye('COM17', 115200) grideye2.start() + distanceSensor = Distance('COM18', 9600) + distanceSensor.start() + fourcc = cv2.VideoWriter_fourcc(*'XVID') videoWriter = cv2.VideoWriter('output.avi', fourcc, 10.0, (SIZE*2,SIZE*2)) cv2.imshow('sample', np.zeros((SIZE*2,SIZE*2), np.uint8)) + aver1 = np.zeros((SIZE,SIZE), np.uint16) + aver2 = np.zeros((SIZE,SIZE), np.uint16) + cnt = 0 while True: if grideye.frame and grideye2.frame: grideye.lock.acquire() grideye2.lock.acquire() + distanceSensor.lock.acquire() frame = grideye.frame grideye.frame = None frame2 = grideye2.frame grideye2.frame = None # frame2 = frame + distance2Object = distanceSensor.distance + distanceSensor.lock.release() grideye2.lock.release() grideye.lock.release() - img = (np.array(frame.data)-15)*10 - img = cv2.equalizeHist(cv2.resize(img.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC)) # INTER_LINEAR, INTER_CUBIC + img = cv2.resize(img.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC) # INTER_LINEAR, INTER_CUBIC img2 = (np.array(frame2.data)-15)*10 - img2 = cv2.equalizeHist(cv2.resize(img2.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC)) + img2 = cv2.resize(img2.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC) - out = np.zeros((SIZE*2, SIZE*2), dtype=np.uint16) + if cnt < AVERAGE_FRAME: + cnt += 1 + aver1 += img + aver2 += img2 + if cnt == AVERAGE_FRAME: + aver1 = aver1/AVERAGE_FRAME + aver1 = aver1.astype(np.uint8) + aver1 += ADJUST_BACK + aver2 = aver2/AVERAGE_FRAME + aver2 = aver2.astype(np.uint8) + aver2 += ADJUST_BACK + continue + img = cv2.subtract(img, aver1) + img2 = cv2.subtract(img2, aver2) + + out = np.full((SIZE*3, SIZE*2), 255, dtype=np.uint16) out[:SIZE, :SIZE] = img out[:SIZE, SIZE:] = img2 + overlap = int(SIZE - (distanceBetweenSensors / (2*distance2Object*math.tan(30.0/180.0*math.pi))) * SIZE) offset = int(overlap/2) - out[SIZE:, offset:SIZE+offset] = img - out[SIZE:, (SIZE-overlap)+offset:SIZE+offset] += img2[:,:overlap] - out[SIZE:, (SIZE-overlap)+offset:SIZE+offset] = out[SIZE:, (SIZE-overlap)+offset:SIZE+offset]/2 + # tmp = cv2.resize(img.astype(np.uint8), (SIZE*2-overlap, SIZE)) + # tmp.astype(np.uint16) + tmp = np.zeros((SIZE, SIZE*2-overlap), dtype=np.uint16) + tmp[:, :SIZE] = img + tmp[:, -SIZE:] += img2 + tmp[:, (SIZE-overlap): SIZE] = tmp[:, (SIZE-overlap): SIZE]/2 + tmp = exponential(tmp, EXPONENTAL_VALUE) + out[SIZE:SIZE*2, offset: SIZE*2-overlap+offset] = tmp + # out[SIZE:SIZE*2, offset:SIZE+offset] = img + # out[SIZE:SIZE*2, (SIZE-overlap)+offset:SIZE+offset] += img2[:,:overlap] + # out[SIZE:SIZE*2, (SIZE-overlap)+offset:SIZE+offset] = out[SIZE:SIZE*2, (SIZE-overlap)+offset:SIZE+offset]/2 + # out[SIZE:SIZE*2, SIZE+offset:SIZE+(SIZE-overlap)+offset] = img2[:,overlap:SIZE] + - out[SIZE:, SIZE+offset:SIZE+(SIZE-overlap)+offset] = img2[:,overlap:SIZE] + maxProduct = 0 + overlap2 = 0 + for i in range(80, 128): + product = sum(img[:,SIZE-i:].astype(np.uint32)*img2[:,:i].astype(np.uint32)) + product = sum(product) / len(product) + if product > maxProduct: + maxProduct = product + overlap2 = i + + + + offset = int(overlap2/2) + tmp = np.zeros((SIZE, SIZE*2-overlap2), dtype=np.uint16) + tmp[:, :SIZE] = img + tmp[:, -SIZE:] += img2 + tmp[:, (SIZE-overlap2): SIZE] = tmp[:, (SIZE-overlap2): SIZE]/2 + tmp = exponential(tmp, EXPONENTAL_VALUE) + out[SIZE*2:, offset: SIZE*2-overlap2+offset] = tmp + + + # out[SIZE*2:, offset:SIZE+offset] = img + # out[SIZE*2:, (SIZE-overlap2)+offset:SIZE+offset] += img2[:,:overlap2] + # out[SIZE*2:, (SIZE-overlap2)+offset:SIZE+offset] = out[SIZE*2:, (SIZE-overlap2)+offset:SIZE+offset]/2 + # out[SIZE*2:, SIZE+offset:SIZE+(SIZE-overlap2)+offset] = img2[:,overlap2:SIZE] out = out.astype(np.uint8) + cv2.imshow('sample', out) videoWriter.write(cv2.cvtColor(out,cv2.COLOR_GRAY2BGR)) key = cv2.waitKey(1)