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.

127 lines
4.3 KiB

  1. import cv2
  2. import serial
  3. import threading
  4. import time
  5. class Frame():
  6. def __init__(self, time, data):
  7. self.time = time
  8. self.data = data
  9. class GridEye():
  10. def __init__(self, serialPort, baudrate):
  11. self.port = serial.Serial(serialPort, baudrate)
  12. self.frame = None
  13. self.reading = True
  14. self.thread = threading.Thread(target = self.reader)
  15. self.thread.setDaemon(True)
  16. self.lock = threading.Lock()
  17. def start(self):
  18. self.port.reset_input_buffer()
  19. self.thread.start()
  20. def stop(self):
  21. self.reading = False
  22. self.thread.join()
  23. def reader(self):
  24. data = []
  25. data_time = 0;
  26. while (self.reading):
  27. line = b''
  28. while (self.reading):
  29. c = self.port.read()
  30. if c == b'\r':
  31. c = self.port.read()
  32. break
  33. if c == b'\n':
  34. break
  35. line += c
  36. #line = self.port.readline()#.decode('utf-8')
  37. # if line:
  38. # print (line)
  39. # time.sleep(0.01)
  40. # if self.port.in_waiting > 0:
  41. # print (self.port.in_waiting)
  42. if b'#' in line:
  43. if len(data) == 8:
  44. #print (data)
  45. self.lock.acquire()
  46. self.frame = Frame(data_time, data)
  47. self.lock.release()
  48. else:
  49. print ('something wrong', len(data))
  50. data_time = time.time()
  51. data = []
  52. else:
  53. try:
  54. row = [float(x) for x in line.split()]
  55. if len(row) == 8:
  56. data.append(row)
  57. except ValueError as e:
  58. print ('error', e)
  59. data_time = time.time()
  60. data = []
  61. if len(data) > 8:
  62. data.pop(0)
  63. if __name__ == '__main__':
  64. import cv2
  65. import numpy as np
  66. SIZE = 128
  67. overlap = 120
  68. grideye = GridEye('COM17', 115200)
  69. grideye.start()
  70. grideye2 = GridEye('COM15', 115200)
  71. grideye2.start()
  72. fourcc = cv2.VideoWriter_fourcc(*'XVID')
  73. videoWriter = cv2.VideoWriter('output.avi', fourcc, 10.0, (SIZE*2,SIZE*2))
  74. cv2.imshow('sample', np.zeros((SIZE*2,SIZE*2), np.uint8))
  75. while True:
  76. if grideye.frame and grideye2.frame:
  77. grideye.lock.acquire()
  78. grideye2.lock.acquire()
  79. frame = grideye.frame
  80. grideye.frame = None
  81. frame2 = grideye2.frame
  82. grideye2.frame = None
  83. # frame2 = frame
  84. grideye2.lock.release()
  85. grideye.lock.release()
  86. img = (np.array(frame.data)-15)*10
  87. img = cv2.equalizeHist(cv2.resize(img.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC)) # INTER_LINEAR, INTER_CUBIC
  88. img2 = (np.array(frame2.data)-15)*10
  89. img2 = cv2.equalizeHist(cv2.resize(img2.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_CUBIC))
  90. out = np.zeros((SIZE*2, SIZE*2), dtype=np.uint16)
  91. out[:SIZE, :SIZE] = img
  92. out[:SIZE, SIZE:] = img2
  93. offset = int(overlap/2)
  94. out[SIZE:, offset:SIZE+offset] = img
  95. out[SIZE:, (SIZE-overlap)+offset:SIZE+offset] += img2[:,:overlap]
  96. out[SIZE:, (SIZE-overlap)+offset:SIZE+offset] = out[SIZE:, (SIZE-overlap)+offset:SIZE+offset]/2
  97. out[SIZE:, SIZE+offset:SIZE+(SIZE-overlap)+offset] = img2[:,overlap:SIZE]
  98. out = out.astype(np.uint8)
  99. cv2.imshow('sample', out)
  100. videoWriter.write(cv2.cvtColor(out,cv2.COLOR_GRAY2BGR))
  101. key = cv2.waitKey(1)
  102. if key == ord('q'):
  103. break
  104. elif key == ord('a'):
  105. overlap += 1
  106. elif key == ord('d'):
  107. overlap -= 1
  108. elif key == ord('c'):
  109. cv2.imwrite('out.jpg', out)
  110. time.sleep(0.001)
  111. grideye.stop()
  112. grideye2.stop()