30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
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
|
|
|