|
|
@ -11,12 +11,14 @@ class Frame(): |
|
|
|
class GridEye(): |
|
|
|
def __init__(self, serialPort, baudrate): |
|
|
|
self.port = serial.Serial(serialPort, baudrate) |
|
|
|
self.frames = [] |
|
|
|
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): |
|
|
@ -44,11 +46,10 @@ class GridEye(): |
|
|
|
# print (self.port.in_waiting) |
|
|
|
if b'#' in line: |
|
|
|
if len(data) == 8: |
|
|
|
print (data_time) |
|
|
|
#print (data) |
|
|
|
self.frames.append(Frame(data_time, data)) |
|
|
|
if len(self.frames) > 100: |
|
|
|
self.frames.pop(0) |
|
|
|
self.lock.acquire() |
|
|
|
self.frame = Frame(data_time, data) |
|
|
|
self.lock.release() |
|
|
|
else: |
|
|
|
print ('something wrong', len(data)) |
|
|
|
data_time = time.time() |
|
|
@ -72,29 +73,56 @@ if __name__ == '__main__': |
|
|
|
import numpy as np |
|
|
|
SIZE = 128 |
|
|
|
overlap = 120 |
|
|
|
grideye = GridEye('COM12', 115200) |
|
|
|
grideye = GridEye('COM17', 115200) |
|
|
|
grideye.start() |
|
|
|
cv2.imshow('sample', np.empty((SIZE*2,SIZE*2), np.uint8)) |
|
|
|
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 len(grideye.frames) > 0: |
|
|
|
frame = grideye.frames.pop(0) |
|
|
|
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_LINEAR) |
|
|
|
img2 = np.copy(img) |
|
|
|
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.empty((SIZE*2, SIZE*2), dtype=np.uint16) |
|
|
|
out = np.zeros((SIZE*2, SIZE*2), dtype=np.uint16) |
|
|
|
out[:SIZE, :SIZE] = img |
|
|
|
out[:SIZE, SIZE:] = img2 |
|
|
|
|
|
|
|
out[SIZE:, :SIZE] = img |
|
|
|
out[SIZE:, (SIZE-overlap):SIZE] += img2[:,:overlap] |
|
|
|
out[SIZE:, (SIZE-overlap):SIZE] = out[SIZE:, (SIZE-overlap):SIZE]/2 |
|
|
|
|
|
|
|
out[SIZE:, SIZE:SIZE+(SIZE-overlap)] = img2[:,overlap: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 |
|
|
|
|
|
|
|
out[SIZE:, SIZE+offset:SIZE+(SIZE-overlap)+offset] = img2[:,overlap:SIZE] |
|
|
|
out = out.astype(np.uint8) |
|
|
|
cv2.imshow('sample', out) |
|
|
|
if cv2.waitKey(1) == ord('q'): |
|
|
|
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() |
|
|
|
|