licornea_tools
intrinsics.cc
Go to the documentation of this file.
1 #include "intrinsics.h"
2 #include <iostream>
3 
4 namespace tlz {
5 
7  intrinsics intr;
8  intr.K = decode_mat(j_intr["K"]);
9  intr.K_inv = intr.K.inv();
10  if(has(j_intr, "distortion")) {
11  intr.distortion.k1 = get_or(j_intr["distortion"], "k1", 0.0);
12  intr.distortion.k2 = get_or(j_intr["distortion"], "k2", 0.0);
13  intr.distortion.k3 = get_or(j_intr["distortion"], "k3", 0.0);
14  intr.distortion.p1 = get_or(j_intr["distortion"], "p1", 0.0);
15  intr.distortion.p2 = get_or(j_intr["distortion"], "p2", 0.0);
16  }
17  intr.width = j_intr["width"];
18  intr.height = j_intr["height"];
19  return intr;
20 }
21 
22 
24  json j_intr;
25  j_intr["K"] = encode_mat(intr.K);
26  j_intr["distortion"] = json::object();
27  j_intr["distortion"]["k1"] = intr.distortion.k1;
28  j_intr["distortion"]["k2"] = intr.distortion.k2;
29  j_intr["distortion"]["k3"] = intr.distortion.k3;
30  j_intr["distortion"]["p1"] = intr.distortion.p1;
31  j_intr["distortion"]["p2"] = intr.distortion.p2;
32  j_intr["width"] = intr.width;
33  j_intr["height"] = intr.height;
34  return j_intr;
35 }
36 
37 
38 vec2 undistort_point(const intrinsics& intr, const vec2& distorted) {
39  std::vector<vec2> distorted_arr { distorted };
40  std::vector<vec2> undistorted_arr = undistort_points(intr, distorted_arr);
41  return undistorted_arr.front();
42 }
43 
44 
45 std::vector<vec2> undistort_points(const intrinsics& intr, const std::vector<vec2>& distorted) {
46  if(intr.distortion.is_none()) return distorted;
47 
48  std::vector<vec2> undistorted;
49  undistorted.reserve(distorted.size());
50 
51  cv::undistortPoints(
52  distorted,
53  undistorted,
54  intr.K,
55  intr.distortion.cv_coeffs(),
56  cv::noArray(),
57  intr.K
58  );
59 
60  return undistorted;
61 }
62 std::vector<cv::Vec2f> undistort_points(const intrinsics& intr, const std::vector<cv::Vec2f>& distorted) {
63  if(intr.distortion.is_none()) return distorted;
64 
65  std::vector<cv::Vec2f> undistorted;
66  undistorted.reserve(distorted.size());
67 
68  cv::undistortPoints(
69  distorted,
70  undistorted,
71  intr.K,
72  intr.distortion.cv_coeffs(),
73  cv::noArray(),
74  intr.K
75  );
76 
77  return undistorted;
78 
79 }
80 
81 
82 vec2 distort_point(const intrinsics& intr, const vec2& undistorted) {
83  if(intr.distortion.is_none()) return undistorted;
84 
85  const auto& d = intr.distortion;
86 
87  real ix = undistorted[0], iy = undistorted[1];
88 
89  real x = (ix - intr.cx()) / intr.fx();
90  real y = (iy - intr.cy()) / intr.fy();
91 
92  real rr = x*x + y*y;
93  real kr = 1.0 + d.k1*rr + d.k2*rr*rr + d.k3*rr*rr*rr;
94  real dx = x * kr;
95  real dy = y * kr;
96 
97  dx += 2.0 * d.p1 * x * y + d.p2*(rr + 2.0 * x * x);
98  dy += d.p1 * (rr + 2.0 * y * y) + 2.0 * d.p2 * x * y;
99 
100  real idx = intr.fx() * dx + intr.cx();
101  real idy = intr.fy() * dy + intr.cy();
102  return vec2(idx, idy);
103 }
104 
105 
106 std::vector<vec2> distort_points(const intrinsics& intr, const std::vector<vec2>& undistorted) {
107  if(intr.distortion.is_none()) return undistorted;
108 
109  std::vector<vec2> distorted(undistorted.size());
110 
111  #pragma omp parallel for
112  for(std::ptrdiff_t i = 0; i < undistorted.size(); ++i)
113  distorted[i] = distort_point(intr, undistorted[i]);
114 
115  return distorted;
116 }
117 
118 
120  std::cout << "loading intrinsics" << std::endl;
121  return decode_intrinsics(json_arg());
122 }
123 
124 
125 
126 }
vec2 undistort_point(const intrinsics &intr, const vec2 &distorted)
Definition: intrinsics.cc:38
std::vector< vec2 > distort_points(const intrinsics &intr, const std::vector< vec2 > &undistorted)
Definition: intrinsics.cc:106
bool has(const json &j, const std::string &key)
Definition: json.h:24
json encode_intrinsics(const intrinsics &intr)
Definition: intrinsics.cc:23
real cy() const
Definition: intrinsics.h:37
cv::Vec< real, 2 > vec2
Definition: common.h:22
cv::Mat_< real > decode_mat(const json &j)
Definition: json.cc:32
intrinsics intrinsics_arg()
Definition: intrinsics.cc:119
real fx() const
Definition: intrinsics.h:34
json json_arg()
Definition: json.h:34
distortion_parameters distortion
Definition: intrinsics.h:30
json encode_mat(const Mat &mat)
Definition: json.h:19
double real
Definition: common.h:16
vec2 distort_point(const intrinsics &intr, const vec2 &undistorted)
Definition: intrinsics.cc:82
std::vector< real > cv_coeffs() const
Definition: intrinsics.h:17
std::vector< vec2 > undistort_points(const intrinsics &intr, const std::vector< vec2 > &distorted)
Definition: intrinsics.cc:45
intrinsics decode_intrinsics(const json &j_intr)
Definition: intrinsics.cc:6
real cx() const
Definition: intrinsics.h:36
real fy() const
Definition: intrinsics.h:35
nlohmann::json json
Definition: json.h:11
T get_or(const json &j, const std::string &key, const T &default_value)
Definition: json.h:28