1extern crate nalgebra as na;
2
3use na::{Vector2,Matrix3x4,Matrix3};
4use std::collections::HashMap;
5
6#[derive(Debug,PartialEq)]
7pub struct CameraFeatures {
8 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