from pathlib import Path
from typing import Union, Dict, Type
import aniposelib as ap_lib
from .plotting import Intrinsics
from .video_metadata import VideoMetadata
[docs]class VideoInterface:
def __init__(
self, video_metadata: VideoMetadata, output_dir: Path, recreate_undistorted_plots: bool = True
) -> None:
self.video_metadata = video_metadata
if self.video_metadata.calibration:
filename = f"{self.video_metadata.recording_date}_{self.video_metadata.cam_id}" \
f"_charuco_undistorted_image"
elif self.video_metadata.recording:
filename = f"{self.video_metadata.mouse_id}_{self.video_metadata.recording_date}" \
f"_{self.video_metadata.paradigm}_{self.video_metadata.cam_id}_undistorted_image"
elif self.video_metadata.calvin:
filename = f"{self.video_metadata.recording_date}_{self.video_metadata.cam_id}" \
f"_calvin_undistorted_image"
self.plot_camera_intrinsics = Intrinsics(video_filepath=self.video_metadata.filepath,
intrinsic_calibration=self.video_metadata.intrinsic_calibration,
filename=filename, fisheye=self.video_metadata.fisheye,
output_directory=output_dir)
self.plot_camera_intrinsics.create_plot(save=recreate_undistorted_plots, plot=False)
[docs] def run_synchronizer(
self,
synchronizer: Type,
output_directory: Path,
synchronize_only: bool,
overwrite_DLC_analysis_and_synchro: bool,
synchro_metadata: Dict,
verbose: bool = True
) -> None:
self.synchronizer_object = synchronizer(
video_metadata=self.video_metadata,
output_directory=output_directory,
synchro_metadata=synchro_metadata,
)
(
self.marker_detection_filepath,
self.synchronized_video_filepath,
) = self.synchronizer_object.run_synchronization(
synchronize_only=synchronize_only, overwrite_DLC_analysis_and_synchro=overwrite_DLC_analysis_and_synchro, verbose=verbose
)
[docs] def export_for_aniposelib(self) -> Union:
if not self.video_metadata.calibration:
return self.marker_detection_filepath
else:
return self._export_as_aniposelib_camera_object()
[docs] def inspect_intrinsic_calibration(self) -> None:
self.plot_camera_intrinsics.plot()
def _export_as_aniposelib_camera_object(self):
if self.video_metadata.fisheye:
camera = ap_lib.cameras.FisheyeCamera(
name=self.video_metadata.cam_id,
matrix=self.video_metadata.intrinsic_calibration["K"],
dist=self.video_metadata.intrinsic_calibration["D"],
extra_dist=False,
)
else:
camera = ap_lib.cameras.Camera(
name=self.video_metadata.cam_id,
matrix=self.video_metadata.intrinsic_calibration["K"],
dist=self.video_metadata.intrinsic_calibration["D"],
extra_dist=False,
)
return camera