Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

void Impala::Core::Array::ColorMoments ( Array2dScalarReal64 *&  CMInvariants,
Array2dVec3UInt8 *  rgb,
int  order,
int  degree,
bool  blur = true,
double  sigma = 10.0 
) [inline]

Definition at line 172 of file ColorMoments.h.

References Impala::Core::Array::ArraySet< ArrayT >::Array(), B02(), B12(), C02(), C02tilde(), C11(), C12_1(), C12_2(), C12_3(), C12_4(), Impala::Core::Array::ColorMoment::Clean(), Impala::Core::Array::ColorMoment::first, Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::H(), Mul(), Impala::Core::Array::ColorMoment::next, PixSum(), ProjectRange(), RecGauss(), Set(), SetVal(), Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::SetValue(), Impala::Application::DemoCamera2d::sigma, and Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::W().

Referenced by Impala::Core::Feature::ComputeRegionDescriptor().

00174 {
00175 
00176     Real64 TotalPixels=rgb->W()*rgb->H();
00177     ArraySet<Array2dScalarReal64>* X=new ArraySet<Array2dScalarReal64>(order+1);
00178     ArraySet<Array2dScalarReal64>* Y=new ArraySet<Array2dScalarReal64>(order+1);
00179     
00180     ArraySet<Array2dScalarReal64>* R=new ArraySet<Array2dScalarReal64>(degree+1);
00181     ArraySet<Array2dScalarReal64>* G=new ArraySet<Array2dScalarReal64>(degree+1);
00182     ArraySet<Array2dScalarReal64>* B=new ArraySet<Array2dScalarReal64>(degree+1);
00183     
00184     X->Array(0)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00185     Y->Array(0)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00186     R->Array(0)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00187     G->Array(0)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00188     B->Array(0)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00189 
00190     //Oth order/degree values are all 1;
00191     SetVal(X->Array(0),1);
00192     SetVal(Y->Array(0),1);
00193     SetVal(R->Array(0),1);
00194     SetVal(G->Array(0),1);
00195     SetVal(B->Array(0),1);
00196 
00197     //1st order/degree values are same with corresponding vectors
00198     X->Array(1)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00199     Y->Array(1)=new Array2dScalarReal64(rgb->W(),rgb->H(),0,0);
00200     for(int i=0;i<rgb->W();i++){
00201         for(int j=0;j<rgb->H();j++){
00202             X->Array(1)->SetValue(i,i,j);
00203             Y->Array(1)->SetValue(j,i,j);
00204         }
00205     }
00206     ProjectRange(R->Array(1),rgb,1);
00207     ProjectRange(G->Array(1),rgb,2);
00208     ProjectRange(B->Array(1),rgb,3);
00209     
00210     if(blur){
00211         Array2dScalarReal64* tmp=0;
00212         RecGauss(tmp,R->Array(1),sigma,sigma,0,0,1);
00213         Set(R->Array(1),tmp);
00214         delete tmp;tmp=0;
00215         RecGauss(tmp,G->Array(1),sigma,sigma,0,0,1);
00216         Set(G->Array(1),tmp);
00217         delete tmp;tmp=0;
00218         RecGauss(tmp,B->Array(1),sigma,sigma,0,0,1);
00219         Set(B->Array(1),tmp);
00220         delete tmp;tmp=0;
00221     }
00222 
00223     for(int o=2;o<=order;o++){
00224         Mul(X->Array(o),X->Array(o-1),X->Array(1));
00225         Mul(Y->Array(o),Y->Array(o-1),Y->Array(1));
00226     }
00227     for(int d=2;d<=degree;d++){
00228         Mul(R->Array(d),R->Array(d-1),R->Array(1));
00229         Mul(G->Array(d),G->Array(d-1),G->Array(1));
00230         Mul(B->Array(d),B->Array(d-1),B->Array(1));
00231     }
00232     ColorMoment* last=0;
00233     for(int o=0;o<=order;o++){
00234         for (int p=0;p<=o;p++){
00235             for (int q=0;q<=o;q++){
00236                 if( p+q == o)
00237                     for(int d=0;d<=degree;d++){
00238                         for(int r=0;r<=d;r++){
00239                             for(int g=0;g<=d;g++){
00240                                 for(int b=0;b<=d;b++){
00241                                     if(r+g+b==d){
00242                                         Array2dScalarReal64* m = 0;
00243                                         Set(m,R->Array(r));
00244                                         if(g!=0)
00245                                             Mul(m,m,G->Array(g));
00246                                         if(b!=0)
00247                                             Mul(m,m,B->Array(b));
00248                                         if(p!=0)
00249                                             Mul(m,m,X->Array(p));
00250                                         if(q!=0)
00251                                             Mul(m,m,Y->Array(q));
00252                                         Real64 Moment=PixSum(m)/TotalPixels;
00253                                         delete m;
00254                                         ColorMoment* cm = new ColorMoment(p,q,r,g,b,Moment,NULL);
00255                                         if(ColorMoment::first==NULL)
00256                                             ColorMoment::first=cm;
00257                                         if(last){
00258                                             last->next=cm;
00259                                         }
00260                                         last=cm;
00261                                     }
00262                                 }
00263                             }
00264                         }
00265                     }
00266             }
00267         }
00268     }
00269     ColorMoment* m=ColorMoment::first;
00270 
00271     int count=1;
00272 //    while(m){
00273 //        std::cout<<count++<<". "<<m->p<<" "<<m->q<<" "<<m->a<<" "<<m->b<<" "<<m->c<<" : "<<m->value<<std::endl;
00274 //        m=m->next;
00275 //    }
00276     //moment CMInvariants//
00277     if(CMInvariants==0){
00278         CMInvariants=new Array2dScalarReal64(24,1,0,0);
00279     }
00280 
00281     int i=0;
00282    CMInvariants->SetValue(B02('R'),i++,0);
00283     CMInvariants->SetValue(B02('G'),i++,0);
00284     CMInvariants->SetValue(B02('B'),i++,0);
00285     CMInvariants->SetValue(C02("RG"),i++,0);
00286     CMInvariants->SetValue(C02("RB"),i++,0);
00287     CMInvariants->SetValue(C02("GB"),i++,0);
00288     CMInvariants->SetValue(C02tilde("RG"),i++,0);
00289     CMInvariants->SetValue(C02tilde("RB"),i++,0);
00290     CMInvariants->SetValue(C02tilde("GB"),i++,0);
00291 
00292     CMInvariants->SetValue(C11("RG"),i++,0);
00293     CMInvariants->SetValue(C11("RB"),i++,0);
00294     CMInvariants->SetValue(C11("GB"),i++,0);
00295     CMInvariants->SetValue(B12('R'),i++,0);
00296     CMInvariants->SetValue(B12('G'),i++,0);
00297     CMInvariants->SetValue(B12('B'),i++,0);
00298     CMInvariants->SetValue(C12_1("RG"),i++,0);
00299     CMInvariants->SetValue(C12_1("RB"),i++,0);
00300     CMInvariants->SetValue(C12_1("GB"),i++,0);
00301     CMInvariants->SetValue(C12_2("RG"),i++,0);
00302     CMInvariants->SetValue(C12_2("RB"),i++,0);
00303     CMInvariants->SetValue(C12_2("GB"),i++,0);
00304     
00305     CMInvariants->SetValue(C12_3("RG"),i++,0);
00306     CMInvariants->SetValue(C12_3("GB"),i++,0);
00307     CMInvariants->SetValue(C12_4("RB"),i++,0);
00308 
00309     ColorMoment::Clean();
00310     for(int o=0;o<=order;o++){
00311         delete X->Array(o);
00312         delete Y->Array(o);
00313     }
00314     for(int d=0;d<=degree;d++){
00315         delete R->Array(d);
00316         delete G->Array(d);
00317         delete B->Array(d);
00318     }
00319     delete X,Y,R,G,B;
00320     //PrintData(CMInvariants,false);
00321 }

Here is the call graph for this function:


Generated on Fri Mar 19 10:56:18 2010 for ImpalaSrc by  doxygen 1.5.1