36 static constexpr
double threshold = 1
e-8;
37 if (r > threshold || r < -threshold) {
41 double r2 = r * r, r4 = r2 *
r2;
42 return 1.0 - r2 / 3 + r4 / 5;
49 const double xi = p.x(), yi = p.y();
50 const double r2 = xi * xi + yi * yi, r =
sqrt(r2);
51 const double t =
atan(r);
52 const double t2 = t *
t, t4 = t2 * t2, t6 = t2 * t4, t8 = t4 * t4;
55 T << 1, t2, t4, t6, t8;
56 const double scaling =
Scaling(r);
57 const double s = scaling * K.dot(T);
58 const double xd = s *
xi, yd = s * yi;
62 if (H1 || H2) DK <<
fx_,
s_, 0.0,
fy_;
68 DR1 << xd, 0.0, yd, 1.0, 0.0, 0.0, yd, 0.0, 0.0, 1.0;
72 auto T4 = T.tail<4>().transpose();
73 DR2 << xi *
T4, yi *
T4;
74 *H1 << DR1, DK * scaling * DR2;
80 1 + 3 * k1_ * t2 + 5 * k2_ * t4 + 7 * k3_ * t6 + 9 * k4_ * t8;
81 const double dt_dr = 1 / (1 +
r2);
82 const double rinv = 1 / r;
83 const double dr_dxi = xi * rinv;
84 const double dr_dyi = yi * rinv;
85 const double dtd_dxi = dtd_dt * dt_dr * dr_dxi;
86 const double dtd_dyi = dtd_dt * dt_dr * dr_dyi;
88 const double td = t * K.dot(T);
89 const double rrinv = 1 /
r2;
90 const double dxd_dxi =
91 dtd_dxi * dr_dxi + td * rinv - td * xi * rrinv * dr_dxi;
92 const double dxd_dyi = dtd_dyi * dr_dxi - td * xi * rrinv * dr_dyi;
93 const double dyd_dxi = dtd_dxi * dr_dyi - td * yi * rrinv * dr_dxi;
94 const double dyd_dyi =
95 dtd_dyi * dr_dyi + td * rinv - td * yi * rrinv * dr_dyi;
98 DR << dxd_dxi, dxd_dyi, dyd_dxi, dyd_dyi;
110 const double u = uv.x(),
v = uv.y();
111 const double yd = (
v -
v0_) /
fy_;
112 const double xd = (u -
s_ * yd -
u0_) /
fx_;
119 for (iteration = 0; iteration <
maxIterations; ++iteration) {
126 if ((uv_hat - uv).norm() <
tol_)
break;
129 pi = pi - jac.inverse() * (uv_hat - uv);
132 if (iteration >= maxIterations)
133 throw std::runtime_error(
134 "Cal3Fisheye::calibrate fails to converge. need a better " 137 calibrateJacobians<Cal3Fisheye, dimension>(*
this, pi, Dcal, Dp);
145 os <<
", k1: " << cal.
k1() <<
", k2: " << cal.
k2() <<
", k3: " << cal.
k3()
146 <<
", k4: " << cal.
k4();
void print(const Matrix &A, const string &s, ostream &stream)
static double Scaling(double r)
Helper function that calculates atan(r)/r.
double k4_
fisheye distortion coefficients
void print(const std::string &s="") const override
print with optional string
double k2_
fisheye distortion coefficients
double k2() const
Second distortion coefficient.
double tol_
tolerance value when calibrating
GTSAM_EXPORT friend std::ostream & operator<<(std::ostream &os, const Cal3Fisheye &cal)
Output stream operator.
EIGEN_DEVICE_FUNC const SqrtReturnType sqrt() const
double k4() const
Second tangential distortion coefficient.
double k1() const
First distortion coefficient.
virtual Matrix3 K() const
return calibration matrix K
static const Similarity3 T4(R, P, s)
Point2 calibrate(const Point2 &p, OptionalJacobian< 2, 9 > Dcal=boost::none, OptionalJacobian< 2, 2 > Dp=boost::none) const
Eigen::Triplet< double > T
EIGEN_DEVICE_FUNC const AtanReturnType atan() const
Array< double, 1, 3 > e(1./3., 0.5, 2.)
bool equals(const Cal3 &K, double tol=10e-9) const
Check if equal up to specified tolerance.
Expression< Point2 > uv_hat(uncalibrate< Cal3_S2 >, K, projection)
double v0_
principal point
double k3() const
First tangential distortion coefficient.
Vector9 vector() const
Return all parameters as a vector.
typedef and functions to augment Eigen's VectorXd
ofstream os("timeSchurFactors.csv")
bool equals(const Cal3Fisheye &K, double tol=10e-9) const
assert equality up to a tolerance
Point2 uncalibrate(const Point2 &p, OptionalJacobian< 2, 9 > Dcal=boost::none, OptionalJacobian< 2, 2 > Dp=boost::none) const
convert intrinsic coordinates [x_i; y_i] to (distorted) image coordinates [u; v]
Calibration of a fisheye camera.
Annotation indicating that a class derives from another given type.
Vector4 k() const
return distortion parameter vector