Files
sunnypilot/tools/webcam/camera.py
Andrei Radulescu 0f1a9d5c8c webcam: changes for comma zero (#35464)
* 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.

* webcam: set width, height, fps; flip image; use av reformat

* 1280x720 @ 25fps
2025-06-28 11:30:13 -07:00

40 lines
1.1 KiB
Python

import av
import cv2 as cv
class Camera:
def __init__(self, cam_type_state, stream_type, camera_id):
try:
camera_id = int(camera_id)
except ValueError: # allow strings, ex: /dev/video0
pass
self.cam_type_state = cam_type_state
self.stream_type = stream_type
self.cur_frame_id = 0
print(f"Opening {cam_type_state} at {camera_id}")
self.cap = cv.VideoCapture(camera_id)
self.cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280.0)
self.cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720.0)
self.cap.set(cv.CAP_PROP_FPS, 25.0)
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):
frame = av.VideoFrame.from_ndarray(bgr, format='bgr24')
return frame.reformat(format='nv12').to_ndarray()
def read_frames(self):
while True:
ret, frame = self.cap.read()
if not ret:
break
# Rotate the frame 180 degrees (flip both axes)
frame = cv.flip(frame, -1)
yuv = Camera.bgr2nv12(frame)
yield yuv.data.tobytes()
self.cap.release()