Exemplo n.º 1
0
class CameraStreamReader(StreamReader):

    @property
    def end_of_stream(self):
        return False

    @property
    def frame_size(self):
        return self._video_capture.frame_size

    @frame_size.setter
    def frame_size(self, value):
        self._video_capture.frame_size = value

    @property
    def frame_rate(self):
        return self._video_capture.frame_rate

    @property
    def camera_id(self):
        return self._camera_id

    @property
    def frame_rotation_angle(self):
        return self._frame_rotation_angle

    @frame_rotation_angle.setter
    def frame_rotation_angle(self, value):
        self._frame_rotation_angle = value

    def __init__(self, camera_id):
        self._camera_id = camera_id
        self._video_capture = VideoCapture()
        self._frame_rotation_angle = 0
        self._is_opened = self._video_capture.open_camera(camera_id)
        if not self._is_opened:
            raise IOError("The specified camera cannot be opened.")

    def __del__(self):
        self.close()

    def read_next(self):
        if not self._is_opened:
            raise InvalidOperationError("Stream is closed.")
        success, image = self._video_capture.read()
        if not success:
            raise IOError("Failed to read the next frame.")
        return self._create_image(image)

    def _create_image(self, cv_image):
        image = Image(cv_image, ColorMode.BGR)
        if self._frame_rotation_angle != 0:
            image.rotate(self._frame_rotation_angle)
        return image

    def close(self):
        self._is_opened = False
        self._video_capture.release()

    def move_forward(self):
        raise NotImplementedError("This action is not available for this stream type.")

    def move_backward(self):
        raise NotImplementedError("This action is not available for this stream type.")

    def open_camera_settings_window(self):
        self._video_capture.open_camera_settings_window()