| import cv2 |
| from collections import deque |
| from streamlit_webrtc import VideoProcessorBase |
| from src.utilities import Utilities |
| from src.st_context import with_streamlit_context |
|
|
| class VideoProcessor(VideoProcessorBase): |
| def __init__(self, queues, conf_thresh, n, k): |
| self.queues = queues |
| self.conf_thresh = conf_thresh |
| self.n = n |
| self.k = k |
| self.frame_counter = 0 |
| self.utilities = Utilities() |
| self.annotation_counter = 0 |
|
|
| @with_streamlit_context |
| def transform(self, frame): |
| img = frame.to_ndarray(format="bgr24") |
| self.frame_counter += 1 |
|
|
| if self.frame_counter % self.n == 0: |
| |
| preprocessed_frame = self.utilities.preprocess_image(img) |
|
|
| |
| if self.queues['frame_queue'].empty(): |
| self.queues['frame_queue'].put(preprocessed_frame) |
| |
| annotations = self.utilities.detect_annotations(preprocessed_frame, self.queues['text_queue'], self.conf_thresh) |
| if annotations: |
| self.queues['annotation_queue'].put((annotations, self.k)) |
| self.annotation_counter = self.k |
|
|
| |
| if not self.queues['annotation_queue'].empty() and self.annotation_counter > 0: |
| annotations, _ = self.queues['annotation_queue'].get() |
| img = self.utilities.draw_annotations(img, annotations) |
| self.annotation_counter -= 1 |
|
|
| return img |