webcam: back to opencv (#35522)

* Revert "webcam: remove other cv2 usage (#33236)"

This reverts commit 0cade54015.

* Revert "remove cv2 usage (#33101)"

This reverts commit 144e9e271c.

* Revert "remove opencv-python-headless (#33082)"

This reverts commit 488e08507a.

* update uv.lock

* keep av bgr2nv12

* rename
pull/35379/head^2
Andrei Radulescu 2 days ago committed by GitHub
parent d5b5383f1a
commit 8b8f33f488
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      pyproject.toml
  2. 19
      tools/webcam/camera.py
  3. 2
      uv.lock

@ -107,6 +107,7 @@ dev = [
"dbus-next", "dbus-next",
"dictdiffer", "dictdiffer",
"matplotlib", "matplotlib",
"opencv-python-headless",
"parameterized >=0.8, <0.9", "parameterized >=0.8, <0.9",
"pyautogui", "pyautogui",
"pygame", "pygame",

@ -1,4 +1,5 @@
import av import av
import cv2 as cv
class Camera: class Camera:
def __init__(self, cam_type_state, stream_type, camera_id): def __init__(self, cam_type_state, stream_type, camera_id):
@ -10,11 +11,9 @@ class Camera:
self.stream_type = stream_type self.stream_type = stream_type
self.cur_frame_id = 0 self.cur_frame_id = 0
self.container = av.open(camera_id) self.cap = cv.VideoCapture(camera_id)
assert self.container.streams.video, f"Can't open video stream for camera {camera_id}" self.W = self.cap.get(cv.CAP_PROP_FRAME_WIDTH)
self.video_stream = self.container.streams.video[0] self.H = self.cap.get(cv.CAP_PROP_FRAME_HEIGHT)
self.W = self.video_stream.codec_context.width
self.H = self.video_stream.codec_context.height
@classmethod @classmethod
def bgr2nv12(self, bgr): def bgr2nv12(self, bgr):
@ -22,8 +21,10 @@ class Camera:
return frame.reformat(format='nv12').to_ndarray() return frame.reformat(format='nv12').to_ndarray()
def read_frames(self): def read_frames(self):
for frame in self.container.decode(self.video_stream): while True:
img = frame.to_rgb().to_ndarray()[:,:, ::-1] # convert to bgr24 ret, frame = self.cap.read()
yuv = Camera.bgr2nv12(img) if not ret:
break
yuv = Camera.bgr2nv12(frame)
yield yuv.data.tobytes() yield yuv.data.tobytes()
self.container.close() self.cap.release()

@ -1280,6 +1280,7 @@ dev = [
{ name = "dbus-next" }, { name = "dbus-next" },
{ name = "dictdiffer" }, { name = "dictdiffer" },
{ name = "matplotlib" }, { name = "matplotlib" },
{ name = "opencv-python-headless" },
{ name = "parameterized" }, { name = "parameterized" },
{ name = "pyautogui" }, { name = "pyautogui" },
{ name = "pygame" }, { name = "pygame" },
@ -1349,6 +1350,7 @@ requires-dist = [
{ name = "natsort", marker = "extra == 'docs'" }, { name = "natsort", marker = "extra == 'docs'" },
{ name = "numpy", specifier = ">=2.0,<2.2" }, { name = "numpy", specifier = ">=2.0,<2.2" },
{ name = "onnx", specifier = ">=1.14.0" }, { name = "onnx", specifier = ">=1.14.0" },
{ name = "opencv-python-headless", marker = "extra == 'dev'" },
{ name = "parameterized", marker = "extra == 'dev'", specifier = ">=0.8,<0.9" }, { name = "parameterized", marker = "extra == 'dev'", specifier = ">=0.8,<0.9" },
{ name = "pre-commit-hooks", marker = "extra == 'testing'" }, { name = "pre-commit-hooks", marker = "extra == 'testing'" },
{ name = "psutil" }, { name = "psutil" },

Loading…
Cancel
Save