use crate::{CorrespondenceView, Error};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct View<Meta> {
pub obs: CorrespondenceView,
pub meta: Meta,
}
impl<Meta> View<Meta> {
pub fn num_observations(&self) -> usize {
self.obs.points_3d.len()
}
pub fn new(obs: CorrespondenceView, meta: Meta) -> Self {
Self { obs, meta }
}
}
impl View<NoMeta> {
pub fn without_meta(obs: CorrespondenceView) -> Self {
Self { obs, meta: NoMeta }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RigViewObs {
pub cameras: Vec<Option<CorrespondenceView>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RigView<Meta> {
pub obs: RigViewObs,
pub meta: Meta,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RigDataset<Meta> {
pub num_cameras: usize,
pub views: Vec<RigView<Meta>>,
}
impl<Meta> RigDataset<Meta> {
pub fn num_views(&self) -> usize {
self.views.len()
}
pub fn new(views: Vec<RigView<Meta>>, num_cameras: usize) -> Result<Self, Error> {
if views.is_empty() {
return Err(Error::invalid_input("need at least one view"));
}
for (idx, view) in views.iter().enumerate() {
if view.obs.cameras.len() != num_cameras {
return Err(Error::invalid_input(format!(
"view {} has {} cameras, expected {}",
idx,
view.obs.cameras.len(),
num_cameras
)));
}
}
Ok(Self { num_cameras, views })
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct NoMeta;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlanarDataset {
pub views: Vec<View<NoMeta>>,
}
impl PlanarDataset {
pub fn new(views: Vec<View<NoMeta>>) -> Result<Self, Error> {
if views.is_empty() {
return Err(Error::InsufficientData { need: 1, got: 0 });
}
for (i, view) in views.iter().enumerate() {
if view.obs.len() < 4 {
return Err(Error::invalid_input(format!(
"view {} has too few points (need >=4, got {})",
i,
view.obs.len()
)));
}
}
Ok(Self { views })
}
pub fn num_views(&self) -> usize {
self.views.len()
}
}