diff --git a/pyproject.toml b/pyproject.toml index b8c1f6445f..98c9bace92 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,6 +107,7 @@ dev = [ "dbus-next", "dictdiffer", "matplotlib", + "opencv-python-headless", "parameterized >=0.8, <0.9", "pyautogui", "pygame", diff --git a/tools/webcam/camera.py b/tools/webcam/camera.py index 8358846f3a..45f9379038 100644 --- a/tools/webcam/camera.py +++ b/tools/webcam/camera.py @@ -1,4 +1,5 @@ import av +import cv2 as cv class Camera: def __init__(self, cam_type_state, stream_type, camera_id): @@ -10,11 +11,9 @@ class Camera: self.stream_type = stream_type self.cur_frame_id = 0 - self.container = av.open(camera_id) - assert self.container.streams.video, f"Can't open video stream for camera {camera_id}" - self.video_stream = self.container.streams.video[0] - self.W = self.video_stream.codec_context.width - self.H = self.video_stream.codec_context.height + self.cap = cv.VideoCapture(camera_id) + self.W = self.cap.get(cv.CAP_PROP_FRAME_WIDTH) + self.H = self.cap.get(cv.CAP_PROP_FRAME_HEIGHT) @classmethod def bgr2nv12(self, bgr): @@ -22,8 +21,10 @@ class Camera: return frame.reformat(format='nv12').to_ndarray() def read_frames(self): - for frame in self.container.decode(self.video_stream): - img = frame.to_rgb().to_ndarray()[:,:, ::-1] # convert to bgr24 - yuv = Camera.bgr2nv12(img) + while True: + ret, frame = self.cap.read() + if not ret: + break + yuv = Camera.bgr2nv12(frame) yield yuv.data.tobytes() - self.container.close() + self.cap.release() diff --git a/uv.lock b/uv.lock index c5266016f3..530db4ec9d 100644 --- a/uv.lock +++ b/uv.lock @@ -1280,6 +1280,7 @@ dev = [ { name = "dbus-next" }, { name = "dictdiffer" }, { name = "matplotlib" }, + { name = "opencv-python-headless" }, { name = "parameterized" }, { name = "pyautogui" }, { name = "pygame" }, @@ -1349,6 +1350,7 @@ requires-dist = [ { name = "natsort", marker = "extra == 'docs'" }, { name = "numpy", specifier = ">=2.0,<2.2" }, { name = "onnx", specifier = ">=1.14.0" }, + { name = "opencv-python-headless", marker = "extra == 'dev'" }, { name = "parameterized", marker = "extra == 'dev'", specifier = ">=0.8,<0.9" }, { name = "pre-commit-hooks", marker = "extra == 'testing'" }, { name = "psutil" },