import cv2 as cv import numpy as np 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 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): yuv = cv.cvtColor(bgr, cv.COLOR_BGR2YUV_I420) uv_row_cnt = yuv.shape[0] // 3 uv_plane = np.transpose(yuv[uv_row_cnt * 2:].reshape(2, -1), [1, 0]) yuv[uv_row_cnt * 2:] = uv_plane.reshape(uv_row_cnt, -1) return yuv def read_frames(self): while True: sts , frame = self.cap.read() if not sts: break yuv = Camera.bgr2nv12(frame) yield yuv.data.tobytes() self.cap.release()