Skip to content

Commit 0bfb77e

Browse files
committed
webcam: set width, height, fps; flip image; use av reformat
1 parent 652f63c commit 0bfb77e

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

tools/webcam/camera.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
# TODO: remove the cv2 dependency, it's only used here
1+
import av
22
import cv2 as cv
3-
import numpy as np
43

54
class Camera:
65
def __init__(self, cam_type_state, stream_type, camera_id):
@@ -12,23 +11,29 @@ def __init__(self, cam_type_state, stream_type, camera_id):
1211
self.stream_type = stream_type
1312
self.cur_frame_id = 0
1413

14+
print(f"Opening {cam_type_state} at {camera_id}")
15+
1516
self.cap = cv.VideoCapture(camera_id)
17+
18+
self.cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920.0)
19+
self.cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080.0)
20+
self.cap.set(cv.CAP_PROP_FPS, 30.0)
21+
1622
self.W = self.cap.get(cv.CAP_PROP_FRAME_WIDTH)
1723
self.H = self.cap.get(cv.CAP_PROP_FRAME_HEIGHT)
1824

1925
@classmethod
2026
def bgr2nv12(self, bgr):
21-
yuv = cv.cvtColor(bgr, cv.COLOR_BGR2YUV_I420)
22-
uv_row_cnt = yuv.shape[0] // 3
23-
uv_plane = np.transpose(yuv[uv_row_cnt * 2:].reshape(2, -1), [1, 0])
24-
yuv[uv_row_cnt * 2:] = uv_plane.reshape(uv_row_cnt, -1)
25-
return yuv
27+
frame = av.VideoFrame.from_ndarray(bgr, format='bgr24')
28+
return frame.reformat(format='nv12').to_ndarray()
2629

2730
def read_frames(self):
2831
while True:
29-
sts , frame = self.cap.read()
30-
if not sts:
32+
ret, frame = self.cap.read()
33+
if not ret:
3134
break
35+
# Rotate the frame 180 degrees (flip both axes)
36+
frame = cv.flip(frame, -1)
3237
yuv = Camera.bgr2nv12(frame)
3338
yield yuv.data.tobytes()
3439
self.cap.release()

tools/webcam/camerad.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python3
22
import threading
33
import os
4+
import platform
45
from collections import namedtuple
56

67
from msgq.visionipc import VisionIpcServer, VisionStreamType
@@ -25,8 +26,7 @@ def __init__(self):
2526

2627
self.cameras = []
2728
for c in CAMERAS:
28-
cam_device = f"/dev/video{c.cam_id}"
29-
print(f"opening {c.msg_name} at {cam_device}")
29+
cam_device = f"/dev/video{c.cam_id}" if platform.system() != "Darwin" else c.cam_id
3030
cam = Camera(c.msg_name, c.stream_type, cam_device)
3131
self.cameras.append(cam)
3232
self.vipc_server.create_buffers(c.stream_type, 20, cam.W, cam.H)

0 commit comments

Comments
 (0)