vision_calibration_core/
view.rs1use crate::{CorrespondenceView, Error};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct View<Meta> {
9 pub obs: CorrespondenceView,
11 pub meta: Meta,
13}
14
15impl<Meta> View<Meta> {
16 pub fn num_observations(&self) -> usize {
18 self.obs.points_3d.len()
19 }
20
21 pub fn new(obs: CorrespondenceView, meta: Meta) -> Self {
23 Self { obs, meta }
24 }
25}
26
27impl View<NoMeta> {
28 pub fn without_meta(obs: CorrespondenceView) -> Self {
30 Self { obs, meta: NoMeta }
31 }
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct RigViewObs {
37 pub cameras: Vec<Option<CorrespondenceView>>,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct RigView<Meta> {
44 pub obs: RigViewObs,
46 pub meta: Meta,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct RigDataset<Meta> {
53 pub num_cameras: usize,
55 pub views: Vec<RigView<Meta>>,
57}
58
59impl<Meta> RigDataset<Meta> {
60 pub fn num_views(&self) -> usize {
62 self.views.len()
63 }
64
65 pub fn new(views: Vec<RigView<Meta>>, num_cameras: usize) -> Result<Self, Error> {
72 if views.is_empty() {
73 return Err(Error::invalid_input("need at least one view"));
74 }
75 for (idx, view) in views.iter().enumerate() {
76 if view.obs.cameras.len() != num_cameras {
77 return Err(Error::invalid_input(format!(
78 "view {} has {} cameras, expected {}",
79 idx,
80 view.obs.cameras.len(),
81 num_cameras
82 )));
83 }
84 }
85 Ok(Self { num_cameras, views })
86 }
87}
88
89#[derive(Debug, Clone, Default, Serialize, Deserialize)]
91pub struct NoMeta;
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct PlanarDataset {
98 pub views: Vec<View<NoMeta>>,
100}
101
102impl PlanarDataset {
103 pub fn new(views: Vec<View<NoMeta>>) -> Result<Self, Error> {
110 if views.is_empty() {
111 return Err(Error::InsufficientData { need: 1, got: 0 });
112 }
113 for (i, view) in views.iter().enumerate() {
114 if view.obs.len() < 4 {
115 return Err(Error::invalid_input(format!(
116 "view {} has too few points (need >=4, got {})",
117 i,
118 view.obs.len()
119 )));
120 }
121 }
122 Ok(Self { views })
123 }
124
125 pub fn num_views(&self) -> usize {
127 self.views.len()
128 }
129}