42 #include <visp/vpConfig.h>
47 #include <visp/vpMomentCentered.h>
48 #include <visp/vpMomentGravityCenter.h>
49 #include <visp/vpMomentObject.h>
50 #include <visp/vpFeatureMomentBasic.h>
51 #include <visp/vpFeatureMomentCentered.h>
52 #include <visp/vpFeatureMomentDatabase.h>
53 #include <visp/vpFeatureMomentGravityCenter.h>
65 double A_,
double B_,
double C_,
80 "The requested value has not been computed, you should specify a higher order.");
100 double pcombkqcombl = 0.0;
107 double minus1pow = 0.;
110 for (
unsigned int k = 0; k <=p; ++k)
114 for (
unsigned int l = 0; l <= q; ++l)
116 qml = (int)q - (
int)l;
118 minus1pow = pow((
double)-1, (
double)(pmk + qml));
119 pcombkqcombl = pcombk * qcombl;
121 pintom = pcombkqcombl * mkl;
124 term1 += pintom * pmk * pow(xg, pmk-1) * pow(yg, qml) * minus1pow;
126 term2 += pintom * qml * pow(xg, pmk) * pow(yg, qml-1) * minus1pow;
127 Lterm3 += pcombkqcombl * pow(xg, pmk) * pow(yg, qml) * L_mkl * minus1pow;
132 vpMatrix L_mupq = L_xg*term1 + L_yg*term2 + Lterm3;
148 #ifdef VISP_MOMENTS_COMBINE_MATRICES
155 bool found_moment_gravity;
158 double xg = momentGravity.
get()[0];
159 double yg = momentGravity.
get()[1];
161 bool found_feature_gravity_center;
167 bool found_moment_basic;
171 bool found_featuremoment_basic;
176 for(
int i=0;i<(int)order-1;i++){
177 for(
int j=0;j<(int)order-1-i;j++){
181 #else // #ifdef VISP_MOMENTS_COMBINE_MATRICES
182 bool found_moment_centered;
183 bool found_moment_gravity;
205 double n11 = momentCentered.
get(1,1)/momentObject.
get(0,0);
206 double n20 = momentCentered.
get(2,0)/momentObject.
get(0,0);
207 double n02 = momentCentered.
get(0,2)/momentObject.
get(0,0);
208 double Xg = momentGravity.
getXg();
209 double Yg = momentGravity.
getYg();
210 double mu00 = momentCentered.
get(0,0);
231 for (
int i=1; i<(int)order-1; i++){
232 unsigned int i_ = (
unsigned int) i;
233 unsigned int im1_ = i_ - 1;
234 unsigned int ip1_ = i_ + 1;
236 double mu_im10 = momentCentered.
get(im1_,0);
237 double mu_ip10 = momentCentered.
get(ip1_,0);
238 double mu_im11 = momentCentered.
get(im1_,1);
239 double mu_i0 = momentCentered.
get(i_,0);
240 double mu_i1 = momentCentered.
get(i_,1);
242 interaction_matrices[i_][0][VX] = -(i+delta)*
A*mu_i0-(i*
B*mu_im11);
243 interaction_matrices[i_][0][VY] = -(delta)*
B*mu_i0;
245 interaction_matrices[i_][0][WX] = (i+3*delta)*mu_i1+(i+3*delta)*Yg*mu_i0+i*Xg*mu_im11-i*epsilon*n11*mu_im10;
246 interaction_matrices[i_][0][WY] = -(i+3*delta)*mu_ip10-(2*i+3*delta)*Xg*mu_i0+i*epsilon*n20*mu_im10;
247 interaction_matrices[i_][0][VZ] = -
A*interaction_matrices[i_][0][WY]+
B*interaction_matrices[i_][0][WX]+(i+2*delta)*
C*mu_i0;
248 interaction_matrices[i_][0][WZ] = i*mu_im11;
251 for(
int j=1;j<(int)order-1;j++){
252 unsigned int j_ = (
unsigned int) j;
253 unsigned int jm1_ = j_ - 1;
254 unsigned int jp1_ = j_ + 1;
256 double mu_0jm1 = momentCentered.
get(0,jm1_);
257 double mu_0jp1 = momentCentered.
get(0,jp1_);
258 double mu_1jm1 = momentCentered.
get(1,jm1_);
259 double mu_0j = momentCentered.
get(0,j_);
260 double mu_1j = momentCentered.
get(1,j_);
262 interaction_matrices[j_*
order][0][VX] = -(delta)*
A*mu_0j;
263 interaction_matrices[j_*
order][0][VY] = -j*
A*mu_1jm1-(j+delta)*
B*mu_0j;
265 interaction_matrices[j_*
order][0][WX] = (j+3*delta)*mu_0jp1+(2*j+3*delta)*Yg*mu_0j-j*epsilon*n02*mu_0jm1;
266 interaction_matrices[j_*
order][0][WY] = -(j+3*delta)*mu_1j-(j+3*delta)*Xg*mu_0j-j*Yg*mu_1jm1+j*epsilon*n11*mu_0jm1;
267 interaction_matrices[j_*
order][0][VZ] = -
A*interaction_matrices[j_*
order][0][WY]+
B*interaction_matrices[j_*
order][0][WX]+(j+2*delta)*
C*mu_0j;
268 interaction_matrices[j_*
order][0][WZ] = -j*mu_1jm1;
271 for(
int j=1; j<(int)order-1; j++) {
272 unsigned int j_ = (
unsigned int) j;
273 unsigned int jm1_ = j_ - 1;
274 unsigned int jp1_ = j_ + 1;
275 for(
int i=1; i<(int)order-j-1; i++) {
276 unsigned int i_ = (
unsigned int) i;
277 unsigned int im1_ = i_ - 1;
278 unsigned int ip1_ = i_ + 1;
280 double mu_ijm1 = momentCentered.
get(i_,jm1_);
281 double mu_ij = momentCentered.
get(i_,j_);
282 double mu_ijp1 = momentCentered.
get(i_,jp1_);
283 double mu_im1j = momentCentered.
get(im1_,j_);
284 double mu_im1jp1 = momentCentered.
get(im1_,jp1_);
285 double mu_ip1jm1 = momentCentered.
get(ip1_,jm1_);
286 double mu_ip1j = momentCentered.
get(ip1_,j_);
288 interaction_matrices[j_*order+i_][0][VX] = -(i+delta)*
A*mu_ij-i*
B*mu_im1jp1;
289 interaction_matrices[j_*order+i_][0][VY] = -j*
A*mu_ip1jm1-(j+delta)*
B*mu_ij;
291 interaction_matrices[j_*order+i_][0][WX] = (i+j+3*delta)*mu_ijp1+(i+2*j+3*delta)*Yg*mu_ij
292 +i*Xg*mu_im1jp1-i*epsilon*n11*mu_im1j-j*epsilon*n02*mu_ijm1;
293 interaction_matrices[j_*order+i_][0][WY] = -(i+j+3*delta)*mu_ip1j-(2*i+j+3*delta)*Xg*mu_ij
294 -j*Yg*mu_ip1jm1+i*epsilon*n20*mu_im1j+j*epsilon*n11*mu_ijm1;
295 interaction_matrices[j_*order+i_][0][VZ] = -
A*interaction_matrices[j_*order+i_][0][WY]+
B*interaction_matrices[j_*order+i_][0][WX]+(i+j+2*delta)*
C*mu_ij;
296 interaction_matrices[j_*order+i_][0][WZ] = i*mu_im1jp1-j*mu_ip1jm1;
299 #endif // #ifdef VISP_MOMENTS_COMBINE_MATRICES
304 vpTRACE(
" << Ls - CENTRED MOMENTS >>");
305 unsigned int order_m_1 = (
unsigned int)(mu.
order - 1);
306 for(
unsigned int i=0; i<order_m_1; i++){
307 for(
unsigned int j=0; j<order_m_1-i; j++){
308 os <<
"L_mu[" << i <<
"," << j <<
"] = ";
Functionality computation for basic moment feature. Computes the interaction matrix associated with v...
vpFeatureMomentCentered(vpMomentDatabase &moments, double A, double B, double C, vpFeatureMomentDatabase *featureMoments=NULL)
Definition of the vpMatrix class.
This class defines the 2D basic moment . This class is a wrapper for vpMomentObject wich allows to us...
Functionality computation for centered moment feature. Computes the interaction matrix associated wit...
error that can be emited by ViSP classes.
Class for generic objects.
const std::vector< double > & get() const
const std::vector< double > & get() const
std::vector< vpMatrix > interaction_matrices
vpMatrix interaction(unsigned int select_one, unsigned int select_two) const
vpMatrix interaction(unsigned int select_one, unsigned int select_two) const
void compute_interaction()
This class allows to register all vpMoments so they can access each other according to their dependen...
vpMatrix interaction(const unsigned int select=FEATURE_ALL)
This class defines shared system methods/attributes for 2D moment features but no functional code...
const vpMoment & get(const char *type, bool &found) const
vpMomentDatabase & moments
This class defines the double-indexed centered moment descriptor .
double get(unsigned int i, unsigned int j) const
Class describing 2D gravity center moment.
vpObjectType getType() const
const std::vector< double > & get() const
vpFeatureMomentDatabase * featureMomentsDataBase
static long double comb(unsigned int n, unsigned int p)
vpMatrix compute_Lmu_pq(const unsigned int &p, const unsigned int &q, const double &xg, const double &yg, const vpMatrix &L_xg, const vpMatrix &L_yg, const vpMomentBasic &m, const vpFeatureMomentBasic &feature_moment_m) const
std::ostream & matlabPrint(std::ostream &os) const
Print using matlab syntax, to be put in matlab later.
const vpMomentObject & getObject() const
Functionality computation for gravity center moment feature. Computes the interaction matrix associat...
vpFeatureMoment & get(const char *type, bool &found)
This class allows to register all feature moments (implemented in vpFeatureMoment... classes) so they can access each other according to their dependencies.
unsigned int getOrder() const