1 #include "../lib/common.h" 2 #include "../lib/args.h" 3 #include "../lib/dataset.h" 4 #include "../lib/camera.h" 5 #include "../lib/misc.h" 19 int main(
int argc,
const char* argv[]) {
20 get_args(argc, argv,
"dataset_parameters.json cors.json cams.json out_samples.txt [random/all] [random_count=100000]");
30 std::ofstream out_samples_stream(out_samples_filename);
31 out_samples_stream <<
"baseline reprojection_error\n";
35 if(cams_map.find(datas.
view(from).
camera_name()) == cams_map.end())
return NAN;
36 if(cams_map.find(datas.
view(to).
camera_name()) == cams_map.end())
return NAN;
46 std::vector<std::string> common_features;
47 for(
const auto& kv : from_fpoints.
points) {
48 const std::string& feature_name = kv.first;
49 if(to_fpoints.
points.find(feature_name) != to_fpoints.
points.end())
50 common_features.push_back(feature_name);
52 if(common_features.size() == 0)
return NAN;
54 std::vector<real> reprojection_errors;
55 reprojection_errors.reserve(common_features.size());
57 for(
const std::string& feature_name : common_features) {
63 vec3 to_v =
mul_h(pose_transformation, from_v);
64 vec3 to_i = to_intr.K * to_v;
68 reprojection_errors.push_back(reprojection_error);
72 std::ptrdiff_t mid = reprojection_errors.size() / 2;
73 std::nth_element(reprojection_errors.begin(), reprojection_errors.begin()+mid, reprojection_errors.end());
75 real err = reprojection_errors[mid];
78 int baseline = std::sqrt(
sq(from.
x - to.x) +
sq(from.
y - to.y));
83 out_samples_stream << err <<
' ' << baseline <<
'\n';
87 std::cout << from <<
" ->" << to <<
": err" << std::endl;
95 if(mode ==
"random") {
97 std::uniform_int_distribution<std::ptrdiff_t> dist(0, indices.size() - 1);
99 #pragma omp parallel for 100 for(
int i = 0; i < random_count; ++i) {
101 const view_index& from_idx = indices[dist(gen)];
102 const view_index& to_idx = indices[dist(gen)];
103 warp(from_idx, to_idx);
104 std::cout <<
'.' << std::flush;
108 }
else if(mode ==
"all") {
109 #pragma omp parallel for 110 for(
int from = 0; from < indices.size(); ++from) {
111 for(
int to = from + 1; to < indices.size(); ++to) {
114 warp(from_idx, to_idx);
115 std::cout <<
'.' << std::flush;
long int_opt_arg(long def)
Numeric sq(Numeric n)
Compute square of a number.
feature_points undistorted_feature_points_for_view(const image_correspondences &cors, view_index idx, const intrinsics &intr)
Set of features, each on set of views.
std::map< std::string, camera > cameras_map(const camera_array &arr)
mat44 extrinsic_inv() const
Points of different features, on one view.
constexpr real max_reprojection_error
constexpr int min_features_count
std::map< std::string, feature_point > points
camera_array cameras_arg()
vec3 mul_h(const mat44 &mat, const vec3 &vec)
dataset_view view(int x) const
std::string enum_opt_arg(const std::vector< std::string > &options, const std::string &def)
int main(int argc, const char *argv[])
image_correspondences image_correspondences_arg()
intrinsics to_undistorted_intrinsics(const camera &cam, int width, int height)
std::string camera_name() const
std::string out_filename_arg()
std::vector< camera > camera_array
std::vector< view_index > indices() const
cv::Matx< real, 4, 4 > mat44
void get_args(int argc, const char *argv[], const std::string &usage)