Support for video_type in camera plugin
This commit is contained in:
parent
2af47372b0
commit
65d6e5a5f6
1 changed files with 30 additions and 9 deletions
|
@ -46,7 +46,7 @@ class CameraPlugin(Plugin):
|
||||||
_max_stored_frames = 100
|
_max_stored_frames = 100
|
||||||
|
|
||||||
def __init__(self, device_id=0, frames_dir=_default_frames_dir,
|
def __init__(self, device_id=0, frames_dir=_default_frames_dir,
|
||||||
warmup_frames=_default_warmup_frames,
|
warmup_frames=_default_warmup_frames, video_type=0,
|
||||||
sleep_between_frames=_default_sleep_between_frames,
|
sleep_between_frames=_default_sleep_between_frames,
|
||||||
max_stored_frames=_max_stored_frames,
|
max_stored_frames=_max_stored_frames,
|
||||||
color_transform=_default_color_transform, *args, **kwargs):
|
color_transform=_default_color_transform, *args, **kwargs):
|
||||||
|
@ -67,6 +67,12 @@ class CameraPlugin(Plugin):
|
||||||
camera)
|
camera)
|
||||||
:type warmup_frames: int
|
:type warmup_frames: int
|
||||||
|
|
||||||
|
:param video_type: Default video type to use when exporting captured
|
||||||
|
frames to camera (default: 0, infers the type from the video file
|
||||||
|
extension). See https://docs.opencv.org/4.0.1/dd/d9e/classcv_1_1VideoWriter.html#afec93f94dc6c0b3e28f4dd153bc5a7f0
|
||||||
|
for a reference on the supported types (e.g. 'MJPEG', 'XVID', 'H264' etc')
|
||||||
|
:type video_type: str or int
|
||||||
|
|
||||||
:param sleep_between_frames: If set, the process will sleep for the
|
:param sleep_between_frames: If set, the process will sleep for the
|
||||||
specified amount of seconds between two frames when recording
|
specified amount of seconds between two frames when recording
|
||||||
(default: 0)
|
(default: 0)
|
||||||
|
@ -89,6 +95,9 @@ class CameraPlugin(Plugin):
|
||||||
self.default_device_id = device_id
|
self.default_device_id = device_id
|
||||||
self.frames_dir = os.path.abspath(os.path.expanduser(frames_dir))
|
self.frames_dir = os.path.abspath(os.path.expanduser(frames_dir))
|
||||||
self.warmup_frames = warmup_frames
|
self.warmup_frames = warmup_frames
|
||||||
|
self.video_type = cv2.VideoWriter_fourcc(*video_type) \
|
||||||
|
if isinstance(video_type, str) else video_type
|
||||||
|
|
||||||
self.sleep_between_frames = sleep_between_frames
|
self.sleep_between_frames = sleep_between_frames
|
||||||
self.max_stored_frames = max_stored_frames
|
self.max_stored_frames = max_stored_frames
|
||||||
self.color_transform = color_transform
|
self.color_transform = color_transform
|
||||||
|
@ -171,7 +180,7 @@ class CameraPlugin(Plugin):
|
||||||
os.unlink(f)
|
os.unlink(f)
|
||||||
|
|
||||||
|
|
||||||
def _make_video_file(self, frames_dir, video_file):
|
def _make_video_file(self, frames_dir, video_file, video_type):
|
||||||
files = self._get_stored_frames_files(frames_dir)
|
files = self._get_stored_frames_files(frames_dir)
|
||||||
if not files:
|
if not files:
|
||||||
self.logger.warning('No frames found in {}'.format(frames_dir))
|
self.logger.warning('No frames found in {}'.format(frames_dir))
|
||||||
|
@ -180,7 +189,7 @@ class CameraPlugin(Plugin):
|
||||||
frame = cv2.imread(files[0])
|
frame = cv2.imread(files[0])
|
||||||
height, width, layers = frame.shape
|
height, width, layers = frame.shape
|
||||||
fps = self._get_avg_fps(frames_dir)
|
fps = self._get_avg_fps(frames_dir)
|
||||||
video = cv2.VideoWriter(video_file, 0, fps, (width, height))
|
video = cv2.VideoWriter(video_file, video_type, fps, (width, height))
|
||||||
|
|
||||||
for f in files:
|
for f in files:
|
||||||
video.write(cv2.imread(f))
|
video.write(cv2.imread(f))
|
||||||
|
@ -192,7 +201,7 @@ class CameraPlugin(Plugin):
|
||||||
|
|
||||||
def _recording_thread(self, duration, video_file, image_file, device_id,
|
def _recording_thread(self, duration, video_file, image_file, device_id,
|
||||||
frames_dir, n_frames, sleep_between_frames,
|
frames_dir, n_frames, sleep_between_frames,
|
||||||
max_stored_frames, color_transform):
|
max_stored_frames, color_transform, video_type):
|
||||||
device = self._devices[device_id]
|
device = self._devices[device_id]
|
||||||
color_transform = getattr(cv2, self.color_transform)
|
color_transform = getattr(cv2, self.color_transform)
|
||||||
|
|
||||||
|
@ -248,7 +257,8 @@ class CameraPlugin(Plugin):
|
||||||
self.logger.info('Writing frames to video file {}'.
|
self.logger.info('Writing frames to video file {}'.
|
||||||
format(video_file))
|
format(video_file))
|
||||||
self._make_video_file(frames_dir=frames_dir,
|
self._make_video_file(frames_dir=frames_dir,
|
||||||
video_file=video_file)
|
video_file=video_file,
|
||||||
|
video_type=video_type)
|
||||||
self.logger.info('Video file {}: rendering completed'.
|
self.logger.info('Video file {}: rendering completed'.
|
||||||
format(video_file))
|
format(video_file))
|
||||||
|
|
||||||
|
@ -256,9 +266,10 @@ class CameraPlugin(Plugin):
|
||||||
|
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def start_recording(self, duration=None, video_file=None, device_id=None,
|
def start_recording(self, duration=None, video_file=None, video_type=None,
|
||||||
frames_dir=None, sleep_between_frames=None,
|
device_id=None, frames_dir=None,
|
||||||
max_stored_frames=None, color_transform=None):
|
sleep_between_frames=None, max_stored_frames=None,
|
||||||
|
color_transform=None):
|
||||||
"""
|
"""
|
||||||
Start recording
|
Start recording
|
||||||
|
|
||||||
|
@ -270,6 +281,9 @@ class CameraPlugin(Plugin):
|
||||||
video file (default: None)
|
video file (default: None)
|
||||||
:type video_file: str
|
:type video_file: str
|
||||||
|
|
||||||
|
:param video_type: Overrides the default configured ``video_type``
|
||||||
|
:type video_file: str
|
||||||
|
|
||||||
:param device_id, frames_dir, sleep_between_frames, max_stored_frames: Set
|
:param device_id, frames_dir, sleep_between_frames, max_stored_frames: Set
|
||||||
these parameters if you want to override the default configured ones.
|
these parameters if you want to override the default configured ones.
|
||||||
"""
|
"""
|
||||||
|
@ -288,6 +302,12 @@ class CameraPlugin(Plugin):
|
||||||
color_transform = color_transform if color_transform \
|
color_transform = color_transform if color_transform \
|
||||||
is not None else self.color_transform
|
is not None else self.color_transform
|
||||||
|
|
||||||
|
if video_type is not None:
|
||||||
|
video_type = cv2.VideoWriter_fourcc(*video_type.upper()) \
|
||||||
|
if isinstance(video_type, str) else video_type
|
||||||
|
else:
|
||||||
|
video_type = self.video_type
|
||||||
|
|
||||||
self._init_device(device_id)
|
self._init_device(device_id)
|
||||||
self.register_handler(CameraRecordingStartedEvent, on_recording_started)
|
self.register_handler(CameraRecordingStartedEvent, on_recording_started)
|
||||||
|
|
||||||
|
@ -300,6 +320,7 @@ class CameraPlugin(Plugin):
|
||||||
self._recording_threads[device_id] = threading.Thread(
|
self._recording_threads[device_id] = threading.Thread(
|
||||||
target=self._recording_thread(duration=duration,
|
target=self._recording_thread(duration=duration,
|
||||||
video_file=video_file,
|
video_file=video_file,
|
||||||
|
video_type=video_type,
|
||||||
image_file=None, device_id=device_id,
|
image_file=None, device_id=device_id,
|
||||||
frames_dir=frames_dir, n_frames=None,
|
frames_dir=frames_dir, n_frames=None,
|
||||||
sleep_between_frames=sleep_between_frames,
|
sleep_between_frames=sleep_between_frames,
|
||||||
|
@ -349,7 +370,7 @@ class CameraPlugin(Plugin):
|
||||||
self.register_handler(CameraPictureTakenEvent, on_picture_taken)
|
self.register_handler(CameraPictureTakenEvent, on_picture_taken)
|
||||||
self._recording_threads[device_id] = threading.Thread(
|
self._recording_threads[device_id] = threading.Thread(
|
||||||
target=self._recording_thread(duration=None, video_file=None,
|
target=self._recording_thread(duration=None, video_file=None,
|
||||||
image_file=image_file,
|
image_file=image_file, video_type=None,
|
||||||
device_id=device_id, frames_dir=None,
|
device_id=device_id, frames_dir=None,
|
||||||
n_frames=warmup_frames,
|
n_frames=warmup_frames,
|
||||||
sleep_between_frames=None,
|
sleep_between_frames=None,
|
||||||
|
|
Loading…
Reference in a new issue