licornea_tools
visualize.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <fstream>
3 #include <string>
4 #include <cstdlib>
5 #include "../lib/args.h"
6 #include "../lib/assert.h"
7 #include "../lib/camera.h"
8 
9 using namespace tlz;
10 
11 int main(int argc, const char* argv[]) {
12  get_args(argc, argv, "in_cameras.json out_view.ply world/view [scale=1.0]");
13  camera_array cameras = cameras_arg();
14  std::string out_ply = out_filename_arg();
15  std::string mode = enum_arg({ "world", "view" });
16  real scale = real_opt_arg(1.0);
17  bool world = (mode == "world");
18 
19  Assert(cameras.size() > 0);
20  std::cout << cameras.size() << " cameras..." << std::endl;
21 
22  mat44 model_transform(
23  2.0*scale, 0.0, 0.0, 0.0,
24  0.0, 1.0*scale, 0.0, 0.0,
25  0.0, 0.0, 1.0*scale, 0.0,
26  0.0, 0.0, 0.0, 1.0
27  );
28 
29  std::vector<vec3> vertices;
30  std::vector<std::vector<std::ptrdiff_t>> faces;
31 
32  if(world) {
33  real camera_depth = 2.0;
34  vertices = {
35  vec3(0, 0, 0), // 0: base
36  vec3(+1, -1, camera_depth), // 1: top left
37  vec3(+1, +1, camera_depth), // 2: top right
38  vec3(-1, +1, camera_depth), // 3: bottom left
39  vec3(-1, -1, camera_depth) // 4: bottom right
40  };
41  faces = {
42  {0, 2, 1}, // top
43  {0, 3, 2}, // right
44  {0, 4, 3}, // bottom,
45  {0, 1, 4}, // left,
46  {1, 2, 3, 4}, // back
47  };
48 
49  } else {
50  vec3 sz(1.0, 1.0, 0.5);
51  vertices = {
52  vec3(-sz[0], +sz[1], +sz[2]), // 0
53  vec3(+sz[0], +sz[1], +sz[2]), // 1
54  vec3(-sz[0], -sz[1], +sz[2]), // 2
55  vec3(+sz[0], -sz[1], +sz[2]), // 3
56  vec3(-sz[0], +sz[1], -sz[2]), // 4
57  vec3(+sz[0], +sz[1], -sz[2]), // 5
58  vec3(-sz[0], -sz[1], -sz[2]), // 6
59  vec3(+sz[0], -sz[1], -sz[2]) // 7
60  };
61  faces = {
62  {0, 2, 3, 1}, // front
63  {4, 5, 7, 6}, // back
64  {4, 6, 2, 0}, // left
65  {1, 3, 7, 5}, // right
66  {4, 0, 1, 5}, // top
67  {2, 6, 7, 3} // bottom
68  };
69  }
70 
71 
72  std::ofstream output(out_ply.c_str());
73  output << "ply\n";
74  output << "format ascii 1.0\n";
75  output << "element vertex " << cameras.size() * vertices.size() << '\n';
76  output << "property float x\n";
77  output << "property float y\n";
78  output << "property float z\n";
79  output << "element face " << cameras.size() * faces.size() << '\n';
80  output << "property list uchar int vertex_indices\n";
81  output << "end_header\n";
82 
83  for(const camera& cam : cameras) {
84  mat44 M;
85  if(world) M = cam.extrinsic().inv() * model_transform;
86  else M = cam.extrinsic() * model_transform;
87 
88  for(const vec3& model_vertex : vertices) {
89  vec3 shown_vertex = mul_h(M, model_vertex);
90  output << shown_vertex[0] << ' ' << shown_vertex[1] << ' ' << shown_vertex[2] << '\n';
91  }
92  }
93 
94  int idx = 0;
95  for(std::ptrdiff_t camera_index = 0; camera_index < cameras.size(); ++camera_index) {
96  for(const std::vector<std::ptrdiff_t>& face : faces) {
97  output << face.size();
98  for(std::ptrdiff_t face_idx : face) output << ' ' << face_idx + idx;
99  output << '\n';
100  }
101  idx += vertices.size();
102  }
103 
104  std::cout << "done" << std::endl;
105 }
double real_opt_arg(double def)
Definition: args.h:54
std::string enum_arg(const std::vector< std::string > &options)
Definition: args.cc:154
camera_array cameras_arg()
Definition: camera.cc:107
vec3 mul_h(const mat44 &mat, const vec3 &vec)
Definition: common.h:29
double real
Definition: common.h:16
cv::Vec< real, 3 > vec3
Definition: common.h:23
int main(int argc, const char *argv[])
Definition: visualize.cc:11
#define Assert
Definition: assert.h:40
std::string out_filename_arg()
Definition: args.cc:104
std::string mode
std::vector< camera > camera_array
Definition: camera.h:26
cv::Matx< real, 4, 4 > mat44
Definition: common.h:27
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49