use sophus_image::{
ArcImage4U8,
ImageSize,
};
use sophus_sensor::DynCameraF64;
use crate::{
camera::{
ClippingPlanes,
RenderCameraProperties,
RenderIntrinsics,
},
prelude::*,
};
#[derive(Clone, Debug)]
pub struct ImageFrame {
pub image: Option<ArcImage4U8>,
pub camera_properties: RenderCameraProperties,
}
impl ImageFrame {
pub fn try_from(
image: &ArcImage4U8,
camera_properties: &RenderCameraProperties,
) -> Option<ImageFrame> {
if camera_properties.intrinsics.image_size().area() == 0 {
return None;
}
if image.image_size() != camera_properties.intrinsics.image_size() {
return None;
}
Some(ImageFrame {
image: Some(image.clone()),
camera_properties: camera_properties.clone(),
})
}
pub fn from_image(image: &ArcImage4U8) -> ImageFrame {
assert!(image.image_size().area() > 0);
let camera_properties = RenderCameraProperties::default_from(image.image_size());
ImageFrame {
image: Some(image.clone()),
camera_properties,
}
}
pub fn from_intrinsics(intrinsics: &DynCameraF64) -> ImageFrame {
assert!(intrinsics.image_size().area() > 0);
ImageFrame {
image: None,
camera_properties: RenderCameraProperties {
intrinsics: RenderIntrinsics::new(intrinsics),
clipping_planes: ClippingPlanes::default(),
},
}
}
pub fn from_camera_properties(camera_properties: &RenderCameraProperties) -> ImageFrame {
ImageFrame {
image: None,
camera_properties: camera_properties.clone(),
}
}
pub fn from_size(view_size: &ImageSize) -> ImageFrame {
assert!(view_size.area() > 0);
ImageFrame {
image: None,
camera_properties: RenderCameraProperties::default_from(*view_size),
}
}
pub fn camera_properties(&self) -> &RenderCameraProperties {
&self.camera_properties
}
pub fn maybe_image(&self) -> Option<&ArcImage4U8> {
self.image.as_ref()
}
}