from io import BytesIO from typing import Optional import cv2 from PIL import Image FACE_DATA = 'haarcascade_frontalface_default.xml' face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + FACE_DATA) class Camera: capture: cv2.VideoCapture def __init__(self): self.capture = cv2.VideoCapture(0) def get_image(self) -> Optional[bytes]: return_code, image = self.capture.read() if not return_code: return None image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(image_gray, 1.3, 5) for (x, y, w, h) in faces: image = cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2) image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) jpg = Image.fromarray(image_rgb) byte_stream = BytesIO() jpg.save(byte_stream, 'JPEG') return bytes(byte_stream.getbuffer())