40 #include <visp3/core/vpMomentCInvariant.h>
41 #include <visp3/core/vpMomentCentered.h>
42 #include <visp3/core/vpMomentObject.h>
50 : I(16), II(4), c(4), s(4), K(0.0), cn(4), sn(4), In1(0.0), flg_sxsynormalization_(flg_sxsynormalization)
60 void vpMomentCInvariant::computeI(
const vpMomentCentered &momentCentered, std::vector<double> &I_val)
63 double mu30 = momentCentered.
get(3, 0);
64 double mu30_2 = mu30 * mu30;
65 double mu30_3 = mu30_2 * mu30;
67 double mu03 = momentCentered.
get(0, 3);
68 double mu03_2 = mu03 * mu03;
69 double mu03_3 = mu03 * mu03_2;
71 double mu20 = momentCentered.
get(2, 0);
72 double mu02 = momentCentered.
get(0, 2);
73 double mu50 = momentCentered.
get(5, 0);
74 double mu32 = momentCentered.
get(3, 2);
75 double mu14 = momentCentered.
get(1, 4);
76 double mu05 = momentCentered.
get(0, 5);
77 double mu23 = momentCentered.
get(2, 3);
78 double mu41 = momentCentered.
get(4, 1);
79 double mu40 = momentCentered.
get(4, 0);
80 double mu04 = momentCentered.
get(0, 4);
81 double mu31 = momentCentered.
get(3, 1);
82 double mu13 = momentCentered.
get(1, 3);
83 double mu22 = momentCentered.
get(2, 2);
84 double mu21 = momentCentered.
get(2, 1);
85 double mu12 = momentCentered.
get(1, 2);
86 double mu11 = momentCentered.
get(1, 1);
88 double mu11_2 = mu11 * mu11;
89 double mu12_2 = mu12 * mu12;
90 double mu21_2 = mu21 * mu21;
91 double mu22_2 = mu22 * mu22;
92 double mu13_2 = mu13 * mu13;
93 double mu31_2 = mu31 * mu31;
94 double mu04_2 = mu04 * mu04;
95 double mu40_2 = mu40 * mu40;
96 double mu21_3 = mu21 * mu21_2;
97 double mu12_3 = mu12_2 * mu12;
98 double mu12_4 = mu12_3 * mu12;
99 double mu21_4 = mu21_2 * mu21_2;
103 double zeta = mu20 - mu02;
104 double zeta_2 = zeta * zeta;
105 double omicron = (mu03_2 + 3 * mu03 * mu21 + mu30 * (mu30 + 3 * mu12));
106 double omega = mu50 + 2 * mu32 + mu14;
107 double nu = mu05 + 2 * mu23 + mu41;
108 double ro = mu50 - 2 * mu32 - 3 * mu14;
109 double gamma = mu05 - 2 * mu23 - 3 * mu41;
111 double delta = mu50 - 10 * mu32 + 5 * mu14;
112 double phi = mu05 - 10 * mu23 + 5 * mu41;
113 double omega_2 = omega * omega;
114 double nu_2 = nu * nu;
115 double ro_2 = ro * ro;
116 double gamma_2 = gamma * gamma;
117 double delta_2 = delta * delta;
118 double phi_2 = phi * phi;
120 I_val[1] = -mu20 * mu02 + mu11_2;
121 I_val[2] = zeta_2 + 4 * mu11_2;
122 I_val[3] = (mu30 - 3 * mu12) * (mu30 - 3 * mu12) + (mu03 - 3 * mu21) * (mu03 - 3 * mu21);
123 I_val[4] = (mu30 + mu12) * (mu30 + mu12) + (mu21 + mu03) * (mu21 + mu03);
124 I_val[5] = -mu30_2 * mu03_2 + (-4 * mu12_3 + 6 * mu21 * mu12 * mu03) * mu30 - 4 * mu21_3 * mu03 + 3 * mu21_2 * mu12_2;
125 I_val[6] = 3 * mu12_4 + 2 * mu30 * mu12_3 + (3 * mu30_2 - 6 * mu03 * mu21) * mu12_2 -
126 6 * mu30 * mu21 * (mu21 + mu03) * mu12 + 2 * mu30_2 * mu03_2 + 2 * mu21_3 * mu03 + 3 * mu21_2 * mu03_2 +
128 I_val[7] = (3 * mu21 + 2 * mu03) * mu12_3 + 3 * mu30 * (mu03 + 2 * mu21) * mu12_2 -
129 3 * mu21 * (mu30 + mu03 + mu21) * (-mu30 + mu03 + mu21) * mu12 +
130 mu30 * (-mu30_2 * mu03 - 2 * mu21_3 - 3 * mu03 * mu21_2 + mu03_3);
132 I_val[8] = 3 * mu03 * mu21_3 - 2 * mu03_2 * mu21_2 + mu21_2 * mu30_2 + 3 * mu12_2 * mu03 * mu21 -
133 mu03 * mu21 * mu30_2 - mu03_3 * mu21 + 3 * mu12_3 * mu30 - 2 * mu12_2 * mu30_2 + mu12_2 * mu03_2 -
134 mu12 * mu30_3 - mu12 * mu30 * mu03_2 + 3 * mu12 * mu30 * mu21_2 - 6 * mu12 * mu30 * mu03 * mu21;
135 I_val[9] = omicron * omicron;
137 I_val[10] = mu40 * mu04 - 4 * mu31 * mu13 + 3 * mu22_2;
138 I_val[11] = 3 * mu13_2 + 2 * mu31 * mu13 + (-3 * mu40 - 3 * mu04) * mu22 - 2 * mu40 * mu04 + 3 * mu31_2;
139 I_val[12] = 3 * mu04_2 + (2 * mu40 + 12 * mu22) * mu04 + 3 * mu40_2 + 12 * mu40 * mu22 + 16 * mu31 * mu13;
140 I_val[13] = omega_2 + nu_2;
141 I_val[14] = ro_2 + gamma_2;
142 I_val[15] = delta_2 + phi_2;
146 a = momentCentered.
get(2, 0) + momentCentered.
get(0, 2);
150 c[1] = momentCentered.
get(2, 0) - momentCentered.
get(0, 2);
151 s[1] = 2 * momentCentered.
get(1, 1);
152 c[2] = momentCentered.
get(0, 3) - 3 * momentCentered.
get(2, 1);
153 s[2] = momentCentered.
get(3, 0) - 3 * momentCentered.
get(1, 2);
154 c[3] = c[1] * c[1] - s[1] * s[1];
155 s[3] = 2 * s[1] * c[1];
157 II[1] = c[1] * c[1] + s[1] * s[1];
158 II[2] = c[2] * c[2] + s[2] * s[2];
159 II[3] = momentCentered.
get(2, 0) + momentCentered.
get(0, 2);
161 K = (II[1] * (II[3] * sqrt(std::fabs(II[3])))) / sqrt(std::fabs(a));
168 double p20 = momentCentered.
get(2, 0) / II[3];
169 double p11 = momentCentered.
get(1, 1) / II[3];
170 double p02 = momentCentered.
get(0, 2) / II[3];
173 sqrt(std::fabs(a)) / (II[3] * sqrt(std::fabs(II[3])));
174 double p30 = momentCentered.
get(3, 0) * d;
175 double p21 = momentCentered.
get(2, 1) * d;
176 double p12 = momentCentered.
get(1, 2) * d;
177 double p03 = momentCentered.
get(0, 3) * d;
181 sn[2] = p30 - 3.0 * p12;
182 cn[2] = p03 - 3.0 * p21;
184 cn[3] = cn[1] * cn[1] - sn[1] * sn[1];
185 sn[3] = 2.0 * sn[1] * cn[1];
187 In1 = cn[1] * cn[1] + sn[1] * sn[1];
200 "Specify at least order 5.");
201 bool found_moment_centered;
205 if (!found_moment_centered)
208 computeI(momentCentered, I);
209 double II3_2 = II[3] * II[3];
210 double II3_3 = II3_2 * II[3];
214 a = momentCentered.
get(2, 0) + momentCentered.
get(0, 2);
229 values[6] = I[11] / I[10];
231 values[7] = I[12] / I[10];
233 values[8] = I[13] / I[15];
235 values[9] = I[14] / I[15];
237 if (flg_sxsynormalization_)
242 values[12] = II[1] / (II3_2);
243 values[13] = a * II[2] / (II3_3);
249 void vpMomentCInvariant::calcSxSy(
double &sx,
double &sy)
const
251 sx = (c[2] * c[3] + s[2] * s[3]) / K;
252 sy = (s[2] * c[3] - c[2] * s[3]) / K;
260 void vpMomentCInvariant::calcSxSyNormalized(
double &sx,
double &sy)
const
262 sx = (cn[2] * cn[3] + sn[2] * sn[3]) / In1;
263 sy = (sn[2] * cn[3] - cn[2] * sn[3]) / In1;
279 for (
unsigned int i = 1; i < I.size(); ++i) {
281 os <<
"I[" << i <<
"]=" << I[i] << std::endl;
291 for (
unsigned int i = 0; i < c.
values.size(); i++) {
292 os << c.
values[i] <<
"," << std::endl;
friend std::ostream & operator<<(std::ostream &s, const vpArray2D< Type > &A)
error that can be emitted by ViSP classes.
@ notInitialized
Used to indicate that a parameter is not initialized.
VP_EXPLICIT vpMomentCInvariant(bool flg_sxsynormalization=false)
void printI(unsigned int index)
void printInvariants(std::ostream &os) const
This class defines the double-indexed centered moment descriptor .
double get(unsigned int i, unsigned int j) const
const vpMoment & get(const std::string &moment_name, bool &found) const
const std::vector< double > & get() const
vpObjectType getType() const
std::vector< double > values
const vpMomentObject & getObject() const
vpMomentDatabase & getMoments() const