1
- # TODO: remove the cv2 dependency, it's only used here
1
+ import av
2
2
import cv2 as cv
3
- import numpy as np
4
3
5
4
class Camera :
6
5
def __init__ (self , cam_type_state , stream_type , camera_id ):
@@ -12,23 +11,29 @@ def __init__(self, cam_type_state, stream_type, camera_id):
12
11
self .stream_type = stream_type
13
12
self .cur_frame_id = 0
14
13
14
+ print (f"Opening { cam_type_state } at { camera_id } " )
15
+
15
16
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
+
16
22
self .W = self .cap .get (cv .CAP_PROP_FRAME_WIDTH )
17
23
self .H = self .cap .get (cv .CAP_PROP_FRAME_HEIGHT )
18
24
19
25
@classmethod
20
26
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 ()
26
29
27
30
def read_frames (self ):
28
31
while True :
29
- sts , frame = self .cap .read ()
30
- if not sts :
32
+ ret , frame = self .cap .read ()
33
+ if not ret :
31
34
break
35
+ # Rotate the frame 180 degrees (flip both axes)
36
+ frame = cv .flip (frame , - 1 )
32
37
yuv = Camera .bgr2nv12 (frame )
33
38
yield yuv .data .tobytes ()
34
39
self .cap .release ()
0 commit comments