14 template <
class VEC2,
class MAT2>
19 typedef VEC2 vec2_type;
20 typedef MAT2 mat2_type;
62 double _rho_pow_c2,_rho_pow_u2,_rho_pow_v2;
72 _c2 = _u2 = _v2 = 0.0;
82 void set_rho(
double rho)
86 _rho_pow[0] = std::pow(rho,2.0);
88 _rho_pow[1] = std::pow(rho,4.0);
90 _rho_pow[2] = std::pow(rho,1.0);
91 _rho_pow[3] = std::pow(rho,1.0);
93 _rho_pow[4] = std::pow(rho,6.0);
95 for(
int i = 0;i < 5;++i)
96 { _c[i] = _c_ocv[i] * _rho_pow[i]; }
124 x_dn = x * (1.0 + _c2 * r2 + _c4 * r4 + _c6 * r6)
125 + (r2 + 2.0 * x2) * (_u2)
128 y_dn = y * (1.0 + _c2 * r2 + _c4 * r4 + _c6 * r6)
129 + (r2 + 2.0 * y2) * (-_v2)
131 return vec2_type(x_dn,y_dn);
135 mat2_type
jacobi(
const vec2_type& p_dn)
const 165 double u2x = _u2 * x;
166 double v2y = (-_v2) * y;
167 double c4r2 = _c4 * r2;
168 double c6r4 = _c6 * r4;
169 m[0][0] = 1.0 + _c2 * (3.0 * x2 + y2) + c4r2 * (5.0 * x2 + y2) + c6r4 * (7.0 * x2 + y2)
172 m[1][1] = 1.0 + _c2 * (x2 + 3.0 * y2) + c4r2 * (x2 + 5.0 * y2) + c6r4 * (x2 + 7.0 * y2)
176 double m_off_diag_common = 2.0 * _c2 * xy + 4.0 * _c4 * xy * r2 + 6.0 * _c6 * xy * r4
177 + 2.0 * _u2 * y + 2.0 * (-_v2) * x;
178 m[0][1] = m_off_diag_common;
179 m[1][0] = m_off_diag_common;
186 void derive(
double* dg,
int n_parameters,
const vec2_type& p_dn)
const 188 int size = 2 * n_parameters;
191 double x2 = p_dn[0] * p_dn[0];
192 double y2 = p_dn[1] * p_dn[1];
193 double xy = p_dn[0] * p_dn[1];
201 dg[k++] = _rho_pow[0] * (x * r2);
202 dg[k++] = _rho_pow[0] * (y * r2);
203 if(k == size)
return;
205 dg[k++] = _rho_pow[1] * (x * r4);
206 dg[k++] = _rho_pow[1] * (y * r4);
207 if(k == size)
return;
209 dg[k++] = -_rho_pow[2] * (2.0 * xy);
210 dg[k++] = -_rho_pow[2] * (r2 + 2.0 * y2);
211 if(k == size)
return;
213 dg[k++] = _rho_pow[3] * (r2 + 2.0 * x2);
214 dg[k++] = _rho_pow[3] * (2.0 * xy);
215 if(k == size)
return;
217 dg[k++] = _rho_pow[4] * (x * r6);
218 dg[k++] = _rho_pow[4] * (y * r6);
219 if(k == size)
return;
221 std::cerr <<
"radial_decentered_distortion_opencv: n_parameters out of range" << std::endl;
223 std::ostream&
out(std::ostream& cout)
const 225 int p = int(cout.precision());
227 cout <<
"c2: " << _c2 << std::endl;
228 cout <<
"c4: " << _c4 << std::endl;
229 cout <<
"v2: " << _v2 << std::endl;
230 cout <<
"u2: " << _u2 << std::endl;
231 cout <<
"c6: " << _c6 << std::endl;
mat2_type jacobi(const vec2_type &p_dn) const
Analytic version of the Jacobi-matrix. By definition, we are working in dn-coordinates here...
Definition: ldpk_radial_decentered_distortion_opencv.h:135
Base class for a distortion model with N parameters. You may find it useful to derive your own distor...
Definition: ldpk_generic_distortion_base.h:20
double get_coeff(int i) const
Get coefficient c[i], 0 <= i < 5.
Definition: ldpk_radial_decentered_distortion_opencv.h:99
void check_range(int i) const
A derived class may check if the index is valid.
Definition: ldpk_generic_distortion_base.h:36
std::ostream & out(std::ostream &cout) const
The derived class implements a method for printing values inside 3DE4's matrix tool dialog...
Definition: ldpk_radial_decentered_distortion_opencv.h:223
void derive(double *dg, int n_parameters, const vec2_type &p_dn) const
Derivative wrt distortion coefficients. dg points to an array with N / 2 Elements Not tested! ...
Definition: ldpk_radial_decentered_distortion_opencv.h:186
The namespace of (most of the) things related to the Lens Distortion Plugin Kit.
Definition: ldpk.h:19
Base class for distortion models.
vec2_type operator()(const vec2_type &p_dn) const
Remove distortion. p_dn is a point in diagonally normalized coordinates. We compute in dn-coordinates...
Definition: ldpk_radial_decentered_distortion_opencv.h:112
A polynomial radially symmetric model of degree 6 with decentering degree 2 as defined in OpenCV...
Definition: ldpk_radial_decentered_distortion_opencv.h:15
void set_coeff(int i, double q)
Set coefficient c[i], 0 <= i < 6.
Definition: ldpk_radial_decentered_distortion_opencv.h:105