42 #include <visp/vpConfig.h>
44 #ifdef VISP_MOMENTS_COMBINE_MATRICES
48 #include <visp/vpMomentObject.h>
49 #include <visp/vpFeatureMomentCentered.h>
50 #include <visp/vpFeatureMomentBasic.h>
51 #include <visp/vpFeatureMomentGravityCenter.h>
52 #include <visp/vpMomentGravityCenter.h>
53 #include <visp/vpFeatureMomentDatabase.h>
64 double A,
double B,
double C,
80 "The requested value has not been computed, you should specify a higher order.");
94 bool found_featuremoment_basic;
95 bool found_feature_gravity_center;
96 bool found_moment_gravity;
108 for(
int i=0;i<6;i++) zeros[0][i]=0;
118 for(
int i=0;i<(int)order;i++){
119 for(
int j=0;j<(int)order-i;j++){
124 for(
int k=0;k<=i;k++){
125 for(
int l=0;l<=j;l++){
126 mat1+= std::abs(momentGravity.
get()[0])<std::numeric_limits<double>::epsilon()?zeros:
vpMath::comb((
unsigned int)i, (
unsigned int)k) *
vpMath::comb((
unsigned int)j, (
unsigned int)l) * pow(-momentGravity.
get()[0], i - k) * (i - k) * LXg / momentGravity.
get()[0] * pow(-momentGravity.
get()[1], j - l) * momentObject.
get((
unsigned int)k, (
unsigned int)l);
127 mat2+= std::abs(momentGravity.
get()[1])<std::numeric_limits<double>::epsilon()?zeros:
vpMath::comb((
unsigned int)i, (
unsigned int)k) *
vpMath::comb((
unsigned int)j, (
unsigned int)l) * pow(-momentGravity.
get()[0], i - k) * pow(-momentGravity.
get()[1], j - l) * (j - l) * LYg / momentGravity.
get()[1] * momentObject.
get((
unsigned int)k, (
unsigned int)l);
128 mat3+=
vpMath::comb((
unsigned int)i, (
unsigned int)k) *
vpMath::comb((
unsigned int)j, (
unsigned int)l) * pow(-momentGravity.
get()[0], i - k) * pow(-momentGravity.
get()[1], j - l) * featureMomentBasic.
interaction((
unsigned int)k, (
unsigned int)l);
141 #include <visp/vpMomentObject.h>
142 #include <visp/vpMomentGravityCenter.h>
143 #include <visp/vpMomentCentered.h>
144 #include <visp/vpFeatureMomentCentered.h>
145 #include <visp/vpFeatureMomentDatabase.h>
184 bool found_moment_centered;
185 bool found_moment_gravity;
207 double n11 = momentCentered.
get(1,1)/momentObject.
get(0,0);
208 double n20 = momentCentered.
get(2,0)/momentObject.
get(0,0);
209 double n02 = momentCentered.
get(0,2)/momentObject.
get(0,0);
210 double Xg = momentGravity.
getXg();
211 double Yg = momentGravity.
getYg();
212 double mu00 = momentCentered.
get(0,0);
233 for (
int i=1; i<(int)order-1; i++){
234 unsigned int i_ = (
unsigned int) i;
235 unsigned int im1_ = i_ - 1;
236 unsigned int ip1_ = i_ + 1;
238 double mu_im10 = momentCentered.
get(im1_,0);
239 double mu_ip10 = momentCentered.
get(ip1_,0);
240 double mu_im11 = momentCentered.
get(im1_,1);
241 double mu_i0 = momentCentered.
get(i_,0);
242 double mu_i1 = momentCentered.
get(i_,1);
244 interaction_matrices[i_][0][VX] = -(i+delta)*
A*mu_i0-(i*
B*mu_im11);
245 interaction_matrices[i_][0][VY] = -(delta)*
B*mu_i0;
247 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;
248 interaction_matrices[i_][0][WY] = -(i+3*delta)*mu_ip10-(2*i+3*delta)*Xg*mu_i0+i*epsilon*n20*mu_im10;
249 interaction_matrices[i_][0][VZ] = -
A*interaction_matrices[i_][0][WY]+
B*interaction_matrices[i_][0][WX]+(i+2*delta)*
C*mu_i0;
250 interaction_matrices[i_][0][WZ] = i*mu_im11;
253 for(
int j=1;j<(int)order-1;j++){
254 unsigned int j_ = (
unsigned int) j;
255 unsigned int jm1_ = j_ - 1;
256 unsigned int jp1_ = j_ + 1;
258 double mu_0jm1 = momentCentered.
get(0,jm1_);
259 double mu_0jp1 = momentCentered.
get(0,jp1_);
260 double mu_1jm1 = momentCentered.
get(1,jm1_);
261 double mu_0j = momentCentered.
get(0,j_);
262 double mu_1j = momentCentered.
get(1,j_);
264 interaction_matrices[j_*order][0][VX] = -(delta)*
A*mu_0j;
265 interaction_matrices[j_*order][0][VY] = -j*
A*mu_1jm1-(j+delta)*
B*mu_0j;
267 interaction_matrices[j_*order][0][WX] = (j+3*delta)*mu_0jp1+(2*j+3*delta)*Yg*mu_0j-j*epsilon*n02*mu_0jm1;
268 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;
269 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;
270 interaction_matrices[j_*order][0][WZ] = -j*mu_1jm1;
273 for(
int j=1; j<(int)order-1; j++) {
274 unsigned int j_ = (
unsigned int) j;
275 unsigned int jm1_ = j_ - 1;
276 unsigned int jp1_ = j_ + 1;
277 for(
int i=1; i<(int)order-j-1; i++) {
278 unsigned int i_ = (
unsigned int) i;
279 unsigned int im1_ = i_ - 1;
280 unsigned int ip1_ = i_ + 1;
282 double mu_ijm1 = momentCentered.
get(i_,jm1_);
283 double mu_ij = momentCentered.
get(i_,j_);
284 double mu_ijp1 = momentCentered.
get(i_,jp1_);
285 double mu_im1j = momentCentered.
get(im1_,j_);
286 double mu_im1jp1 = momentCentered.
get(im1_,jp1_);
287 double mu_ip1jm1 = momentCentered.
get(ip1_,jm1_);
288 double mu_ip1j = momentCentered.
get(ip1_,j_);
290 interaction_matrices[j_*order+i_][0][VX] = -(i+delta)*
A*mu_ij-i*
B*mu_im1jp1;
291 interaction_matrices[j_*order+i_][0][VY] = -j*
A*mu_ip1jm1-(j+delta)*
B*mu_ij;
293 interaction_matrices[j_*order+i_][0][WX] = (i+j+3*delta)*mu_ijp1+(i+2*j+3*delta)*Yg*mu_ij
294 +i*Xg*mu_im1jp1-i*epsilon*n11*mu_im1j-j*epsilon*n02*mu_ijm1;
295 interaction_matrices[j_*order+i_][0][WY] = -(i+j+3*delta)*mu_ip1j-(2*i+j+3*delta)*Xg*mu_ij
296 -j*Yg*mu_ip1jm1+i*epsilon*n20*mu_im1j+j*epsilon*n11*mu_ijm1;
297 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;
298 interaction_matrices[j_*order+i_][0][WZ] = i*mu_im1jp1-j*mu_ip1jm1;
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.
vpMomentObject & getObject() const
double get(unsigned int i, unsigned int j)
error that can be emited by ViSP classes.
Class for generic objects.
std::vector< vpMatrix > interaction_matrices
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)
vpMoment & get(const char *type, bool &found)
This class defines shared system methods/attributes for 2D moment features but no functional code...
std::vector< double > & get()
vpMomentDatabase & moments
This class defines the double-indexed centered moment descriptor .
Class describing 2D gravity center moment.
vpObjectType getType() const
vpMatrix interaction(unsigned int select_one, unsigned int select_two)
static long double comb(unsigned int n, unsigned int p)
Functionality computation for gravity center moment feature. Computes the interaction matrix associat...
std::vector< double > & get()
vpMatrix interaction(unsigned int select_one, unsigned int select_two)
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