licornea_tools
cg_straight_depths_from_depths.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <utility>
3 #include <vector>
4 #include <cmath>
5 #include <algorithm>
6 #include <fstream>
7 #include <set>
8 #include <map>
10 #include "../lib/args.h"
11 #include "../lib/misc.h"
12 #include "../lib/intrinsics.h"
13 #include "../lib/image_io.h"
14 #include "../lib/json.h"
15 #include "../lib/opencv.h"
16 
17 using namespace tlz;
18 
19 constexpr bool verbose = true;
20 
21 int main(int argc, const char* argv[]) {
22  get_args(argc, argv, "image_correspondences.json intrinsics.json R.json out_straight_depths.json");
24  intrinsics intr = intrinsics_arg();
25  mat33 R = decode_mat(json_arg());
26  std::string out_feature_depths = out_filename_arg();
27 
28  image_correspondences undist_cors = undistort(cors, intr);
29 
30  std::map<std::string, std::map<view_index, real>> feature_view_straight_depths;
31 
32 
33  std::cout << "computing feature straight depths" << std::endl;
34  for(const auto& kv : undist_cors.features) {
35  const std::string& feature_name = kv.first;
36  const image_correspondence_feature& feature = kv.second;
37  for(const auto& kv2 : feature.points) {
38  const view_index& view_idx = kv2.first;
39  const feature_point& fpoint = kv2.second;
40 
41  vec2 i_measured_undist = fpoint.position;
42  real d_measured = fpoint.depth;
43  if(d_measured == 0.0) continue;
44 
45  vec3 i_measured_h(i_measured_undist[0], i_measured_undist[1], 1.0);
46  i_measured_h *= d_measured;
47 
48  vec3 v_measured = intr.K_inv * i_measured_h;
49  vec3 v_straight = R.t() * v_measured;
50  real d_straight = v_straight[2];
51 
52  feature_view_straight_depths[feature_name][view_idx] = d_straight;
53  }
54 
55  }
56 
57 
58  std::cout << "aggregating feature straight depths" << std::endl;
59  std::map<std::string, real> avg_straight_depths;
60  real avg_stddev = 0.0;
61  for(const auto& kv : feature_view_straight_depths) {
62  const std::string& feature_name = kv.first;
63  const auto& view_samples = kv.second;
64 
65  // take straight depths of this feature, for all views
66  std::vector<real> straight_depths;
67  for(const auto& kv2 : view_samples) {
68  real d = kv2.second;
69  straight_depths.push_back(d);
70  }
71 
72  // calculate median
73  auto med_it = straight_depths.begin() + straight_depths.size()/2;
74  std::nth_element(straight_depths.begin(), med_it, straight_depths.end());
75  real median = *med_it;
76 
77  // filter out outliers
78  const real outlier_threshold = 10.0;
79  std::vector<real> filtered_straight_depths;
80  for(real d : straight_depths)
81  if(std::abs(d - median) < outlier_threshold) filtered_straight_depths.push_back(d);
82  std::size_t count = filtered_straight_depths.size();
83 
84  // average and stddev of remaining samples
85  real avg = 0.0;
86  for(real d : filtered_straight_depths) avg += d;
87  avg /= count;
88  real stddev = 0.0;
89  for(real d : filtered_straight_depths) stddev += sq(avg - d);
90  avg_stddev += stddev / count;
91  stddev = std::sqrt(stddev / count);
92 
93  if(verbose) {
94  std::cout << feature_name << ":\n";
95  std::cout << " median: " << median << "\n";
96  std::cout << " avg: " << avg << "\n";
97  std::cout << " stddev: " << stddev << "\n";
98  std::cout << " count: " << count << "\n";
99  std::cout << " filtered out: " << view_samples.size()-count << "\n\n";
100  }
101 
102  avg_straight_depths[feature_name] = avg;
103  }
104  avg_stddev = std::sqrt(avg_stddev / avg_straight_depths.size());
105  std::cout << "average stddev: " << avg_stddev << std::endl;
106 
107 
108  std::cout << "saving feature straights depths" << std::endl;
109  {
110  json j_feature_depths = json::object();
111  for(const auto& kv : avg_straight_depths)
112  j_feature_depths[kv.first] = kv.second;
113  export_json_file(j_feature_depths, out_feature_depths);
114  }
115 }
Numeric sq(Numeric n)
Compute square of a number.
Definition: misc.h:17
Set of features, each on set of views.
cv::Vec< real, 2 > vec2
Definition: common.h:22
cv::Mat_< real > decode_mat(const json &j)
Definition: json.cc:32
std::map< std::string, image_correspondence_feature > features
intrinsics intrinsics_arg()
Definition: intrinsics.cc:119
json json_arg()
Definition: json.h:34
cv::Matx< real, 3, 3 > mat33
Definition: common.h:26
std::map< std::string, straight_depth > straight_depths
double real
Definition: common.h:16
void export_json_file(const json &j, const std::string &filename, bool compact)
Definition: json.cc:9
cv::Vec< real, 3 > vec3
Definition: common.h:23
image_correspondences image_correspondences_arg()
feature_points undistort(const feature_points &dist_fpoints, const intrinsics &intr)
std::string out_filename_arg()
Definition: args.cc:104
Feature on set of views. Optionally one view is "reference".
int main(int argc, const char *argv[])
nlohmann::json json
Definition: json.h:11
constexpr bool verbose
std::map< view_index, feature_point > points
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49