import cv2 import serial import threading import time class Frame(): def __init__(self, time, data): self.time = time self.data = data class GridEye(): def __init__(self, serialPort, baudrate): self.port = serial.Serial(serialPort, baudrate) self.frame = None 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): data = [] data_time = 0; 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 #line = self.port.readline()#.decode('utf-8') # if line: # print (line) # time.sleep(0.01) # if self.port.in_waiting > 0: # print (self.port.in_waiting) if b'#' in line: if len(data) == 8: #print (data) self.lock.acquire() self.frame = Frame(data_time, data) self.lock.release() else: print ('something wrong', len(data)) data_time = time.time() data = [] else: try: row = [float(x) for x in line.split()] if len(row) == 8: data.append(row) except ValueError as e: print ('error', e) data_time = time.time() data = [] if len(data) > 8: data.pop(0) if __name__ == '__main__': import cv2 import numpy as np SIZE = 128 overlap = 120 grideye = GridEye('COM17', 115200) grideye.start() grideye2 = GridEye('COM15', 115200) grideye2.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)) while True: if grideye.frame and grideye2.frame: grideye.lock.acquire() grideye2.lock.acquire() frame = grideye.frame grideye.frame = None frame2 = grideye2.frame grideye2.frame = None # frame2 = frame grideye2.lock.release() grideye.lock.release() img = (np.array(frame.data)-15)*10 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.resize(img2.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC) out = np.zeros((SIZE*2, SIZE*2), dtype=np.uint16) out[:SIZE, :SIZE] = img out[:SIZE, SIZE:] = img2 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 out[SIZE:, SIZE+offset:SIZE+(SIZE-overlap)+offset] = img2[:,overlap:SIZE] out = out.astype(np.uint8) cv2.imshow('sample', out) videoWriter.write(cv2.cvtColor(out,cv2.COLOR_GRAY2BGR)) key = cv2.waitKey(1) if key == ord('q'): break elif key == ord('a'): overlap += 1 elif key == ord('d'): overlap -= 1 elif key == ord('c'): cv2.imwrite('out.jpg', out) time.sleep(0.001) grideye.stop() grideye2.stop()