licornea_tools
camera.cc
Go to the documentation of this file.
1 #include "camera.h"
2 #include "json.h"
3 #include <fstream>
4 #include <iomanip>
5 #include <iterator>
6 
7 namespace tlz {
8 
9 namespace {
10 
11 struct frm {
12  real value_;
13  explicit frm(real value) : value_(value) { }
14 };
15 
16 std::ostream& operator<<(std::ostream& stream, const frm& f) {
17  stream << std::setprecision(11) << std::setw(17) << std::setfill(' ') << f.value_;
18  return stream;
19 }
20 
21 }
22 
23 
25  return mat44(
26  rotation(0, 0), rotation(0, 1), rotation(0, 2), translation[0],
27  rotation(1, 0), rotation(1, 1), rotation(1, 2), translation[1],
28  rotation(2, 0), rotation(2, 1), rotation(2, 2), translation[2],
29  0.0, 0.0, 0.0, 1.0
30  );
31 }
32 
33 
35  mat33 R_inv = rotation.t();
36  vec3 t_inv = -R_inv * translation;
37  return mat44(
38  R_inv(0, 0), R_inv(0, 1), R_inv(0, 2), t_inv[0],
39  R_inv(1, 0), R_inv(1, 1), R_inv(1, 2), t_inv[1],
40  R_inv(2, 0), R_inv(2, 1), R_inv(2, 2), t_inv[2],
41  0.0, 0.0, 0.0, 1.0
42  );
43 }
44 
45 
46 void camera::set_extrinsic(const mat44& ex) {
47  for(int i = 0; i < 3; ++i) for(int j = 0; j < 3; ++j)
48  rotation(i, j) = ex(i, j);
49  for(int i = 0; i < 3; ++i)
50  translation[i] = ex(i, 3);
51 }
52 
53 
54 
56  return rotation.t() * translation;
57 }
58 
59 
61  camera_array cams;
62  for(auto& j_cam : j_cams) {
63  camera cam;
64  cam.name = j_cam["name"];
65  cam.intrinsic = decode_mat(j_cam["K"]);
66 
67  mat44 extrinsic = decode_mat(j_cam["Rt"]);
68  cam.rotation = extrinsic.get_minor<3, 3>(0, 0);
69 
70  auto t = extrinsic.get_minor<3, 1>(0, 3);
71  cam.translation = vec3(t(0, 0), t(1, 0), t(2, 0));
72 
73  cams.push_back(cam);
74  }
75  return cams;
76 }
77 
78 
79 void export_cameras_file(const camera_array& cameras, const std::string& filename) {
80  // Does not use json.hpp, prints easier-to-read JSON.
81 
82  std::ofstream stream(filename);
83 
84  stream << "[";
85 
86  bool first = true;
87  for(const camera& cam : cameras) {
88  if(! first) stream << ",";
89  else first = false;
90 
91  stream
92  << "\n{\n"
93  << "\t\"name\" : " << std::quoted(cam.name) << ",\n"
94  << "\t\"K\" : [[" << frm(cam.intrinsic(0, 0)) << ", " << frm(cam.intrinsic(0, 1)) << ", " << frm(cam.intrinsic(0, 2)) << "],\n"
95  << "\t [" << frm(cam.intrinsic(1, 0)) << ", " << frm(cam.intrinsic(1, 1)) << ", " << frm(cam.intrinsic(1, 2)) << "],\n"
96  << "\t [" << frm(cam.intrinsic(2, 0)) << ", " << frm(cam.intrinsic(2, 1)) << ", " << frm(cam.intrinsic(2, 2)) << "]],\n"
97  << "\t\"Rt\" : [[" << frm(cam.rotation(0, 0)) << ", " << frm(cam.rotation(0, 1)) << ", " << frm(cam.rotation(0, 2)) << ", " << frm(cam.translation[0]) << "],\n"
98  << "\t [" << frm(cam.rotation(1, 0)) << ", " << frm(cam.rotation(1, 1)) << ", " << frm(cam.rotation(1, 2)) << ", " << frm(cam.translation[1]) << "],\n"
99  << "\t [" << frm(cam.rotation(2, 0)) << ", " << frm(cam.rotation(2, 1)) << ", " << frm(cam.rotation(2, 2)) << ", " << frm(cam.translation[2]) << "],\n"
100  << "\t [" << frm(0.0) << ", " << frm(0.0) << ", " << frm(0.0) << ", " << frm(1.0) << "]]\n"
101  << "}";
102  }
103  stream << "\n]";
104 }
105 
106 
108  return decode_cameras(json_arg());
109 }
110 
111 
112 std::map<std::string, camera> cameras_map(const camera_array& arr) {
113  std::map<std::string, camera> map;
114  for(const camera& cam : arr) map[cam.name] = cam;
115  return map;
116 }
117 
118 
119 intrinsics to_undistorted_intrinsics(const camera& cam, int width, int height) {
120  intrinsics intr;
121  intr.width = width;
122  intr.height = height;
123  intr.K = cam.intrinsic;
124  intr.K_inv = cam.intrinsic.inv();
125  return intr;
126 }
127 
128 void export_cameras_file(const std::string& filename, const std::map<std::string, camera>& map) {
129  camera_array arr;
130  for(const auto& kv : map) arr.push_back(kv.second);
131  export_cameras_file(arr, filename);
132 }
133 
134 
135 }
void export_cameras_file(const camera_array &cameras, const std::string &filename)
Definition: camera.cc:79
camera_array decode_cameras(const json &j_cams)
Definition: camera.cc:60
mat33 intrinsic
Definition: camera.h:15
std::string name
Definition: camera.h:14
std::map< std::string, camera > cameras_map(const camera_array &arr)
Definition: camera.cc:112
vec3 position() const
Definition: camera.cc:55
mat44 extrinsic_inv() const
Definition: camera.cc:34
mat33 rotation
Definition: camera.h:16
std::ostream & operator<<(std::ostream &, const view_index &)
Definition: dataset.cc:290
camera_array cameras_arg()
Definition: camera.cc:107
cv::Mat_< real > decode_mat(const json &j)
Definition: json.cc:32
json json_arg()
Definition: json.h:34
mat44 extrinsic() const
Definition: camera.cc:24
cv::Matx< real, 3, 3 > mat33
Definition: common.h:26
double real
Definition: common.h:16
cv::Vec< real, 3 > vec3
Definition: common.h:23
void set_extrinsic(const mat44 &)
Definition: camera.cc:46
intrinsics to_undistorted_intrinsics(const camera &cam, int width, int height)
Definition: camera.cc:119
std::vector< camera > camera_array
Definition: camera.h:26
nlohmann::json json
Definition: json.h:11
vec3 translation
Definition: camera.h:17
cv::Matx< real, 4, 4 > mat44
Definition: common.h:27