555
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

128 lines
4.3 KiB

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.equalizeHist(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))
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()