licornea_tools
cg_redistribute_cors.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <fstream>
3 #include <string>
4 #include <cstdlib>
5 #include <stdexcept>
6 #include "../lib/args.h"
7 #include "../lib/json.h"
8 #include "../lib/misc.h"
10 #include "lib/feature_points.h"
11 #include "lib/cg/references_grid.h"
12 
13 using namespace tlz;
14 
15 
16 int main(int argc, const char* argv[]) {
17  get_args(argc, argv, "in_cors.json pseudo_refgrid.json outreach_radius out_cors.json");
19  references_grid pseudo_refgrid = references_grid_arg();
20  int outreach_radius = int_arg();
21  std::string out_cors_filename = out_filename_arg();
22 
23  int outreach_radius_sq = sq(outreach_radius);
24 
25  auto refgrid = get_references_grid(cors);
26  for(std::ptrdiff_t col = 0; col < refgrid.cols(); ++col)
27  for(std::ptrdiff_t row = 0; row < refgrid.rows(); ++row) {
28  view_index idx = refgrid.view(col, row);
29  if(! pseudo_refgrid.has_view(idx)) {
30  std::cout << "pseudo refgrid does not have view " << idx << std::endl;
31  return 0;
32  }
33  }
34 
35  for(std::ptrdiff_t col = 0; col < pseudo_refgrid.cols(); ++col)
36  for(std::ptrdiff_t row = 0; row < pseudo_refgrid.rows(); ++row) {
37  view_index idx = pseudo_refgrid.view(col, row);
38  if(feature_points_for_view(cors, idx).count() == 0) {
39  std::cout << "no features for pseudo reference view " << idx << std::endl;
40  return 0;
41  }
42  }
43 
44  auto ref_vws = get_reference_views(cors);
45 
46  image_correspondences new_cors;
47 
48  for(const view_index& ref_idx : ref_vws) {
49  std::cout << "reference view " << ref_idx << std::endl;
50  auto ref_cors = image_correspondences_with_reference(cors, ref_idx);
51 
52  for(std::ptrdiff_t col = 0; col < pseudo_refgrid.cols(); ++col)
53  for(std::ptrdiff_t row = 0; row < pseudo_refgrid.rows(); ++row) {
54  view_index pseudo_idx = pseudo_refgrid.view(col, row);
55  std::cout << " pseudo reference view " << pseudo_idx << std::endl;
56 
57  for(const auto& kv : ref_cors.features) {
58  const std::string& feature_name = kv.first;
59  const image_correspondence_feature& feature = kv.second;
60 
61 
62  image_correspondence_feature new_feature;
63  new_feature.reference_view = pseudo_idx;
64 
65  for(const auto& kv2 : feature.points) {
66  const view_index& idx = kv2.first;
67  const feature_point& fpoint = kv2.second;
68 
69  if(sq(idx.x - pseudo_idx.x) + sq(idx.y - pseudo_idx.y) <= outreach_radius_sq)
70  new_feature.points[idx] = fpoint;
71  }
72 
73  if(new_feature.points.size() > 0) {
74  std::string new_feature_name = feature_name + "#p" + std::to_string(col) + "," + std::to_string(row);
75  new_cors.features[new_feature_name] = new_feature;
76  }
77  }
78  }
79  }
80 
81  export_image_corresponcences(new_cors, out_cors_filename);
82 }
83 
Numeric sq(Numeric n)
Compute square of a number.
Definition: misc.h:17
int main(int argc, const char *argv[])
image_correspondences image_correspondences_with_reference(const image_correspondences &cors, const view_index &reference_view)
Set of features, each on set of views.
feature_points feature_points_for_view(const image_correspondences &cors, view_index idx, bool is_distorted)
std::map< std::string, image_correspondence_feature > features
references_grid references_grid_arg()
bool has_view(const view_index &) const
std::vector< view_index > get_reference_views(const relative_camera_positions &rcpos)
long int_arg()
Definition: args.cc:138
view_index view(std::ptrdiff_t col, std::ptrdiff_t row) const
image_correspondences image_correspondences_arg()
std::string to_string(const T &)
std::string out_filename_arg()
Definition: args.cc:104
Feature on set of views. Optionally one view is "reference".
std::size_t cols() const
references_grid get_references_grid(const image_correspondences &cors)
void export_image_corresponcences(const image_correspondences &cors, const std::string &filename)
std::map< view_index, feature_point > points
std::size_t rows() const
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49