licornea_tools
calibrate_intrinsics.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <string>
3 #include <cstdlib>
4 #include <stdexcept>
5 #include <climits>
6 #include "../lib/args.h"
7 #include "../lib/json.h"
8 #include "../lib/obj_img_correspondence.h"
9 #include "../lib/opencv.h"
10 #include "../lib/intrinsics.h"
11 
12 using namespace tlz;
13 
14 
15 int main(int argc, const char* argv[]) {
16  get_args(argc, argv, "obj_img_cors_set.json image_width image_height out_intrinsics.json [no_distortion]");
17  std::string obj_img_cors_set_filename = in_filename_arg();
18  int image_width = int_arg();
19  int image_height = int_arg();
20  std::string out_intrinsics_filename = out_filename_arg();
21  bool no_distortion = bool_opt_arg("no_distortion");
22 
23  std::cout << "loading obj-img correspondences set" << std::endl;
24  auto cors_set = decode_obj_img_correspondences_set<1, 1>(import_json_file(obj_img_cors_set_filename));
25 
26  std::cout << "preparing input data" << std::endl;
27  std::vector<std::vector<cv::Vec3f>> object_points(cors_set.size());
28  std::vector<std::vector<cv::Vec2f>> image_points(cors_set.size());
29  for(int set_i = 0; set_i < cors_set.size(); ++set_i) {
30  const auto& cors = cors_set[set_i];
31  auto& obj_points = object_points[set_i];
32  auto& img_points = image_points[set_i];
33  for(const auto& cor : cors) {
34  obj_points.push_back(cor.object_coordinates[0]);
35  img_points.push_back(cor.image_coordinates[0]);
36  }
37  }
38 
39  cv::Size image_size(image_width, image_height);
40 
41  mat33 out_camera_mat;
42  std::vector<real> out_distortion(5, 0.0);
43 
44  std::cout << "computing calibration" << std::endl;
45  std::vector<cv::Mat> out_rotations, out_translations;
46  const cv::TermCriteria term(cv::TermCriteria::COUNT | cv::TermCriteria::EPS, 50, DBL_EPSILON);
47  int flags = CV_CALIB_ZERO_TANGENT_DIST;
48  if(no_distortion) flags |= CV_CALIB_FIX_K1 | CV_CALIB_FIX_K2 | CV_CALIB_FIX_K3;
49  real err = cv::calibrateCamera(
50  object_points,
51  image_points,
52  image_size,
53  out_camera_mat,
54  out_distortion,
55  out_rotations,
56  out_translations,
57  flags,
58  term
59  );
60  std::cout << "reprojection error: " << err << std::endl;
61 
62  std::cout << "saving intrinsics" << std::endl;
63  intrinsics intr;
64  intr.K = out_camera_mat;
65  intr.distortion.k1 = out_distortion[0];
66  intr.distortion.k2 = out_distortion[1];
67  intr.distortion.p1 = out_distortion[2];
68  intr.distortion.p2 = out_distortion[3];
69  intr.distortion.k3 = out_distortion[4];
70  intr.width = image_width;
71  intr.height = image_height;
72  export_json_file(encode_intrinsics(intr), out_intrinsics_filename);
73 
74  std::cout << "done" << std::endl;
75 }
76 
json encode_intrinsics(const intrinsics &intr)
Definition: intrinsics.cc:23
std::string in_filename_arg()
Definition: args.cc:98
distortion_parameters distortion
Definition: intrinsics.h:30
cv::Matx< real, 3, 3 > mat33
Definition: common.h:26
double real
Definition: common.h:16
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::string out_filename_arg()
Definition: args.cc:104
bool bool_opt_arg(const std::string &expected, bool def=false)
Definition: args.h:62
json import_json_file(const std::string &filename)
Definition: json.cc:24
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49
int main(int argc, const char *argv[])