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.

99 lines
3.2 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.frames = []
  13. self.reading = True
  14. self.thread = threading.Thread(target = self.reader)
  15. self.thread.setDaemon(True)
  16. def start(self):
  17. self.thread.start()
  18. def stop(self):
  19. self.reading = False
  20. self.thread.join()
  21. def reader(self):
  22. data = []
  23. data_time = 0;
  24. while (self.reading):
  25. line = b''
  26. while (self.reading):
  27. c = self.port.read()
  28. if c == b'\r':
  29. c = self.port.read()
  30. break
  31. if c == b'\n':
  32. break
  33. line += c
  34. #line = self.port.readline()#.decode('utf-8')
  35. # if line:
  36. # print (line)
  37. # time.sleep(0.01)
  38. # if self.port.in_waiting > 0:
  39. # print (self.port.in_waiting)
  40. if b'#' in line:
  41. if len(data) == 8:
  42. print (data_time)
  43. #print (data)
  44. self.frames.append(Frame(data_time, data))
  45. if len(self.frames) > 100:
  46. self.frames.pop(0)
  47. else:
  48. print ('something wrong', len(data))
  49. data_time = time.time()
  50. data = []
  51. else:
  52. try:
  53. row = [float(x) for x in line.split()]
  54. if len(row) == 8:
  55. data.append(row)
  56. except ValueError as e:
  57. print ('error', e)
  58. data_time = time.time()
  59. data = []
  60. if len(data) > 8:
  61. data.pop(0)
  62. if __name__ == '__main__':
  63. import cv2
  64. import numpy as np
  65. SIZE = 128
  66. overlap = 120
  67. grideye = GridEye('COM12', 115200)
  68. grideye.start()
  69. cv2.imshow('sample', np.empty((SIZE*2,SIZE*2), np.uint8))
  70. while True:
  71. if len(grideye.frames) > 0:
  72. frame = grideye.frames.pop(0)
  73. img = (np.array(frame.data)-15)*10
  74. img = cv2.resize(img.astype(np.uint8), (SIZE,SIZE), interpolation = cv2.INTER_LINEAR)
  75. img2 = np.copy(img)
  76. out = np.empty((SIZE*2, SIZE*2), dtype=np.uint16)
  77. out[:SIZE, :SIZE] = img
  78. out[:SIZE, SIZE:] = img2
  79. out[SIZE:, :SIZE] = img
  80. out[SIZE:, (SIZE-overlap):SIZE] += img2[:,:overlap]
  81. out[SIZE:, (SIZE-overlap):SIZE] = out[SIZE:, (SIZE-overlap):SIZE]/2
  82. out[SIZE:, SIZE:SIZE+(SIZE-overlap)] = img2[:,overlap:SIZE]
  83. out = out.astype(np.uint8)
  84. cv2.imshow('sample', out)
  85. if cv2.waitKey(1) == ord('q'):
  86. break
  87. time.sleep(0.001)
  88. grideye.stop()