licornea_tools
cg_choose_refgrid.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <utility>
3 #include <vector>
4 #include <deque>
5 #include <string>
7 #include "../lib/args.h"
8 #include "../lib/json.h"
9 #include "../lib/filesystem.h"
10 #include "../lib/dataset.h"
11 #include "../lib/image_io.h"
12 
13 using namespace tlz;
14 
15 const bool verbose = false;
17 
18 
19 int main(int argc, const char* argv[]) {
20  get_args(argc, argv, "dataset_parameters.json horiz_key vert_key out_refgrid.json [dataset_group]");
21  dataset datas = dataset_arg();
22  int horizontal_key = int_arg();
23  int vertical_key = int_arg();
24  std::string out_refgrid_filename = out_filename_arg();
25  std::string dataset_group_name = string_opt_arg("");
26 
27  dataset_group datag = datas.group(dataset_group_name);
28 
29  auto column_exists = [&](int x) {
30  // check if image files for all views in this column exist
31  for(int y = datag.set().y_min(); y <= datag.set().y_max(); y += datag.set().y_step()) {
32  view_index idx(x, y);
33  if(! file_exists(datag.view(idx).image_filename())) return false;
34  }
35  return true;
36  };
37 
38  std::cout << "determining X coordinates of reference views" << std::endl;
39  // reference views need to be in columns where all images exist
40  // (cannot have missing files on vertical flow)
41  std::deque<int> reference_x_positions;
42  for(int x = datas.x_mid() - horizontal_key; x >= datas.x_min(); x -= horizontal_key) reference_x_positions.push_front(x);
43  reference_x_positions.push_back(datas.x_mid());
44  for(int x = datas.x_mid() + horizontal_key; x <= datas.x_max(); x += horizontal_key) reference_x_positions.push_back(x);
45  auto reference_x_valid = [&](int x) {
46  return datas.x_valid(x) && column_exists(x);
47  };
48  for(int& x : reference_x_positions) {
49  if(reference_x_valid(x)) continue;
50  bool ok = false;
51  for(int diff = 1; (diff < max_reference_x_deviation) && !ok; ++diff) {
52  if(reference_x_valid(x + diff)) { x += diff; ok = true; }
53  if(reference_x_valid(x - diff)) { x -= diff; ok = true; }
54  }
55  if(! ok)
56  throw std::runtime_error("could not find valid X coordinate near " + std::to_string(x) + " for reference view");
57  }
58 
59 
60  std::cout << "determining Y coordinates of reference views" << std::endl;
61  std::deque<int> reference_y_positions;
62  for(int y = datas.y_mid() - vertical_key; y >= datas.y_min(); y -= vertical_key) reference_y_positions.push_front(y);
63  reference_y_positions.push_back(datas.y_mid());
64  for(int y = datas.y_mid() + vertical_key; y <= datas.y_max(); y += vertical_key) reference_y_positions.push_back(y);
65 
66  std::cout << "saving reference grid" << std::endl;
67  references_grid grid;
68  grid.x_indices.assign(reference_x_positions.begin(), reference_x_positions.end());
69  grid.y_indices.assign(reference_y_positions.begin(), reference_y_positions.end());
70  export_json_file(encode_references_grid(grid), out_refgrid_filename);
71 }
72 
bool file_exists(const std::string &filename)
std::string image_filename() const
Definition: dataset.cc:64
int x_max() const
Definition: dataset.cc:169
int x_min() const
Definition: dataset.cc:165
dataset_view view(int x) const
Definition: dataset.cc:105
bool x_valid(int x) const
Definition: dataset.cc:178
int x_mid() const
Definition: dataset.cc:186
const int max_reference_x_deviation
json encode_references_grid(const references_grid &grid)
dataset dataset_arg()
Definition: dataset.cc:297
std::vector< int > y_indices
long int_arg()
Definition: args.cc:138
void export_json_file(const json &j, const std::string &filename, bool compact)
Definition: json.cc:9
std::vector< int > x_indices
const bool verbose
int y_step() const
Definition: dataset.cc:206
std::string to_string(const T &)
std::string out_filename_arg()
Definition: args.cc:104
int y_max() const
Definition: dataset.cc:201
int y_min() const
Definition: dataset.cc:196
dataset_group group(const std::string &grp) const
Definition: dataset.cc:265
int main(int argc, const char *argv[])
int y_mid() const
Definition: dataset.cc:226
const dataset & set() const
Definition: dataset.h:58
std::string string_opt_arg(const std::string &def="")
Definition: args.h:36
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49