13
13
from utils .misc_utils import get_camera_index_by_name , list_camera_names
14
14
from enum import Enum
15
15
import sys
16
+ from PIL import Image
17
+ from io import BytesIO
16
18
17
19
WAIT_TIME = 0.1
18
20
BUFFER_SIZE = 32768
@@ -190,20 +192,21 @@ def get_next_packet_bounds(self):
190
192
beg = - 1
191
193
while beg == - 1 :
192
194
self .buffer += self .serial_connection .read (2048 )
193
- beg = self .buffer .find (ETVR_HEADER )
195
+ beg = self .buffer .find (b" \xff \xd8 \xff " )
194
196
# Discard any data before the frame header.
195
197
if beg > 0 :
196
198
self .buffer = self .buffer [beg :]
197
199
beg = 0
198
- # We know exactly how long the jpeg packet is
199
- end = int .from_bytes (self .buffer [4 :6 ], signed = False , byteorder = "little" )
200
- self .buffer += self .serial_connection .read (end - len (self .buffer ))
200
+ end = - 1
201
+ while end == - 1 :
202
+ self .buffer += self .serial_connection .read (128 )
203
+ end = self .buffer .find (b"\xff \xd9 " )
201
204
return beg , end
202
205
203
206
def get_next_jpeg_frame (self ):
204
207
beg , end = self .get_next_packet_bounds ()
205
- jpeg = self .buffer [beg + ETVR_HEADER_LEN : end + ETVR_HEADER_LEN ]
206
- self .buffer = self .buffer [end + ETVR_HEADER_LEN :]
208
+ jpeg = self .buffer [beg : end + 2 ]
209
+ self .buffer = self .buffer [end + 2 :]
207
210
return jpeg
208
211
209
212
def get_serial_camera_picture (self , should_push ):
@@ -216,10 +219,9 @@ def get_serial_camera_picture(self, should_push):
216
219
jpeg = self .get_next_jpeg_frame ()
217
220
if jpeg :
218
221
# Create jpeg frame from byte string
219
- image = cv2 .imdecode (
220
- np .fromstring (jpeg , dtype = np .uint8 ), cv2 .IMREAD_UNCHANGED
221
- )
222
- if image is None :
222
+ try :
223
+ image = np .array (Image .open (BytesIO (jpeg )))
224
+ except Exception :
223
225
print (
224
226
f'{ Fore .YELLOW } [{ lang ._instance .get_string ("log.warn" )} ] { lang ._instance .get_string ("warn.frameDrop" )} { Fore .RESET } '
225
227
)
0 commit comments