import imutils from imutils.video import VideoStream import pyzbar.pyzbar as pyzbar from typing import List, Tuple import cv2 class CameraDriver: def __init__(self, camera_index = 0): self.video_stream = VideoStream(src=camera_index).start() self.frame = None def get_decoded_frame(self, stream_frame_width, decode_frame_width) -> Tuple[bytes, List[str]]: raw_frame = self.video_stream.read() decode_frame = imutils.resize(raw_frame, width=decode_frame_width) codes = pyzbar.decode(decode_frame) data = [] for code in codes: x, y, w, h = code.rect cv2.rectangle(decode_frame, (x, y), (x + w, y + h), (0, 0, 255), 2) data.append(code.data.decode('utf-8')) cv2.putText(decode_frame, data[-1], (x, y -10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2) if codes: stream_frame = imutils.resize(decode_frame, width=stream_frame_width) else: stream_frame = imutils.resize(raw_frame, width=stream_frame_width) _, jpg = cv2.imencode('.jpg', stream_frame) return jpg.tobytes(), data