models_cv/
camera_features.rs

1extern crate nalgebra as na;
2
3use na::{Vector2,Matrix3x4,Matrix3};
4use std::collections::HashMap;
5
6#[derive(Debug,PartialEq)]
7pub struct CameraFeatures {
8    // The first entry of the tuple is the global point id
9    feature_map: HashMap<usize,Vector2<usize>>,
10    cam_id: usize,
11    view_matrix: Matrix3x4<f32>,
12    intrinsic_matrix: Matrix3<f32>
13}
14
15impl CameraFeatures {
16    pub fn new(match_map: HashMap<usize,Vector2<usize>>, cam_id: usize, view_matrix: Matrix3x4<f32>,intrinsic_matrix: Matrix3<f32>) -> CameraFeatures {
17        CameraFeatures {
18            feature_map: match_map,
19            cam_id,
20            view_matrix,
21            intrinsic_matrix
22        }
23    }
24    pub fn get_feature_map(&self) -> &HashMap<usize,Vector2<usize>> {&self.feature_map}
25    pub fn get_cam_id(&self) -> usize {self.cam_id}
26    pub fn get_view_matrix(&self) ->  Matrix3x4<f32> {self.view_matrix}
27    pub fn get_intrinsic_matrix(&self) ->  Matrix3<f32> {self.intrinsic_matrix}
28    pub fn to_serial(fm_vec: &Vec<CameraFeatures>) -> Vec<(usize, [f32;12],[f32;9], Vec<(usize,(usize,usize))>)> {
29        fm_vec.into_iter().map(|fm|{
30            let mut map_vec =  Vec::<(usize,(usize,usize))>::with_capacity(fm.feature_map.len());
31
32            for (k,v) in &fm.feature_map {
33                map_vec.push((*k,(v.x,v.y)));
34            }
35    
36            (fm.cam_id, [
37                fm.view_matrix[(0,0)],
38                fm.view_matrix[(0,1)],
39                fm.view_matrix[(0,2)],
40                fm.view_matrix[(0,3)],
41                fm.view_matrix[(1,0)],
42                fm.view_matrix[(1,1)],
43                fm.view_matrix[(1,2)],
44                fm.view_matrix[(1,3)],
45                fm.view_matrix[(2,0)],
46                fm.view_matrix[(2,1)],
47                fm.view_matrix[(2,2)],
48                fm.view_matrix[(2,3)],
49                ],
50                [
51                fm.intrinsic_matrix[(0,0)],
52                fm.intrinsic_matrix[(0,1)],
53                fm.intrinsic_matrix[(0,2)],
54                fm.intrinsic_matrix[(1,0)],
55                fm.intrinsic_matrix[(1,1)],
56                fm.intrinsic_matrix[(1,2)],
57                fm.intrinsic_matrix[(2,0)],
58                fm.intrinsic_matrix[(2,1)],
59                fm.intrinsic_matrix[(2,2)]
60                ],
61                map_vec
62            )
63        }).collect::<Vec<_>>()
64
65    }
66
67    pub fn from_serial(serial: &Vec<(usize, [f32;12], [f32;9], Vec<(usize,(usize,usize))>)>) -> Vec<CameraFeatures> {
68        serial.into_iter().map(|s| {
69            let cam_id = s.0;
70            let view_arr = &s.1;
71            let intrinsic_arr = &s.2;
72            let vec = &s.3;
73
74            let view_matrix = Matrix3x4::<f32>::new(
75                view_arr[0],view_arr[1],view_arr[2],view_arr[3],
76                view_arr[4],view_arr[5],view_arr[6],view_arr[7],
77                view_arr[8],view_arr[9],view_arr[10],view_arr[11],
78            );
79            let intrinsic_matrix = Matrix3::<f32>::new(
80                intrinsic_arr[0],intrinsic_arr[1],intrinsic_arr[2],
81                intrinsic_arr[3],intrinsic_arr[4],intrinsic_arr[5],
82                intrinsic_arr[6],intrinsic_arr[7],intrinsic_arr[8],
83            );
84
85            let mut feature_map = HashMap::<usize,Vector2<usize>>::with_capacity(vec.len());
86            for &(point_id,(x,y)) in vec {
87                feature_map.insert(point_id, Vector2::new(x,y));
88            }
89    
90            CameraFeatures {
91                feature_map,
92                cam_id,
93                view_matrix,
94                intrinsic_matrix
95            }
96    
97        }).collect::<Vec<_>>()
98
99    }
100}
101
102