Skip to content

Commit 8760fb9

Browse files
authored
Merge pull request #68 from z65536/main
Fix: Corrupted JPEG
2 parents 87543b2 + 630e8b8 commit 8760fb9

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

Diff for: BabbleApp/camera.py

+12-10
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from lang_manager import LocaleStringManager as lang
1313
from colorama import Fore
1414
from config import BabbleConfig, BabbleSettingsConfig
15+
from PIL import Image
16+
from io import BytesIO
1517
from utils.misc_utils import get_camera_index_by_name, list_camera_names, os_type
1618

1719
from vivefacialtracker.vivetracker import ViveTracker
@@ -245,20 +247,21 @@ def get_next_packet_bounds(self):
245247
beg = -1
246248
while beg == -1:
247249
self.buffer += self.serial_connection.read(2048)
248-
beg = self.buffer.find(ETVR_HEADER)
250+
beg = self.buffer.find(b"\xff\xd8\xff")
249251
# Discard any data before the frame header.
250252
if beg > 0:
251253
self.buffer = self.buffer[beg:]
252254
beg = 0
253-
# We know exactly how long the jpeg packet is
254-
end = int.from_bytes(self.buffer[4:6], signed=False, byteorder="little")
255-
self.buffer += self.serial_connection.read(end - len(self.buffer))
255+
end = -1
256+
while end == -1:
257+
self.buffer += self.serial_connection.read(128)
258+
end = self.buffer.find(b"\xff\xd9")
256259
return beg, end
257260

258261
def get_next_jpeg_frame(self):
259262
beg, end = self.get_next_packet_bounds()
260-
jpeg = self.buffer[beg + ETVR_HEADER_LEN : end + ETVR_HEADER_LEN]
261-
self.buffer = self.buffer[end + ETVR_HEADER_LEN :]
263+
jpeg = self.buffer[beg: end + 2]
264+
self.buffer = self.buffer[end + 2 :]
262265
return jpeg
263266

264267
def get_serial_camera_picture(self, should_push):
@@ -271,10 +274,9 @@ def get_serial_camera_picture(self, should_push):
271274
jpeg = self.get_next_jpeg_frame()
272275
if jpeg:
273276
# Create jpeg frame from byte string
274-
image = cv2.imdecode(
275-
np.fromstring(jpeg, dtype=np.uint8), cv2.IMREAD_UNCHANGED
276-
)
277-
if image is None:
277+
try:
278+
image = np.array(Image.open(BytesIO(jpeg)))
279+
except Exception:
278280
print(
279281
f'{Fore.YELLOW}[{lang._instance.get_string("log.warn")}] {lang._instance.get_string("warn.frameDrop")}{Fore.RESET}'
280282
)

0 commit comments

Comments
 (0)