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" 21 int main(
int argc,
const char* argv[]) {
22 get_args(argc, argv,
"image_correspondences.json intrinsics.json R.json out_straight_depths.json");
30 std::map<std::string, std::map<view_index, real>> feature_view_straight_depths;
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;
37 for(
const auto& kv2 : feature.
points) {
43 if(d_measured == 0.0)
continue;
45 vec3 i_measured_h(i_measured_undist[0], i_measured_undist[1], 1.0);
46 i_measured_h *= d_measured;
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];
52 feature_view_straight_depths[feature_name][view_idx] = d_straight;
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;
67 for(
const auto& kv2 : view_samples) {
69 straight_depths.push_back(d);
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;
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();
86 for(
real d : filtered_straight_depths) avg += d;
89 for(
real d : filtered_straight_depths) stddev +=
sq(avg - d);
90 avg_stddev += stddev / count;
91 stddev = std::sqrt(stddev / count);
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";
102 avg_straight_depths[feature_name] = avg;
104 avg_stddev = std::sqrt(avg_stddev / avg_straight_depths.size());
105 std::cout <<
"average stddev: " << avg_stddev << std::endl;
108 std::cout <<
"saving feature straights depths" << std::endl;
110 json j_feature_depths = json::object();
111 for(
const auto& kv : avg_straight_depths)
112 j_feature_depths[kv.first] = kv.second;
Numeric sq(Numeric n)
Compute square of a number.
Set of features, each on set of views.
cv::Mat_< real > decode_mat(const json &j)
std::map< std::string, image_correspondence_feature > features
intrinsics intrinsics_arg()
cv::Matx< real, 3, 3 > mat33
std::map< std::string, straight_depth > straight_depths
void export_json_file(const json &j, const std::string &filename, bool compact)
image_correspondences image_correspondences_arg()
feature_points undistort(const feature_points &dist_fpoints, const intrinsics &intr)
std::string out_filename_arg()
Feature on set of views. Optionally one view is "reference".
int main(int argc, const char *argv[])
std::map< view_index, feature_point > points
void get_args(int argc, const char *argv[], const std::string &usage)