Image-Seek

 view release on metacpan or  search on metacpan

haar.cpp  view on Meta::CPAN

        d3[j*128+i]=Ab3[j];
      }
    }
  }
  memcpy(a,d1,16384*sizeof(double));
  memcpy(b,d2,16384*sizeof(double));
  memcpy(c,d3,16384*sizeof(double));
  Safefree(d1);Safefree(d2);Safefree(d3);Safefree(Ab1);Safefree(Ab2);Safefree(Ab3);
}

int calcHaar(double* cdata1,double* cdata2,double* cdata3,int* sig1,int* sig2,int* sig3,double * avgl)
{
  //TODO: Speed up..
  int cnt,i;
  valStruct vals[41];

  double * cadata1=absarray(cdata1);
  double * cadata2=absarray(cdata2);
  double * cadata3=absarray(cdata3);

  avgl[0]=cdata1[0];
  avgl[1]=cdata2[0];
  avgl[2]=cdata3[0];
  // determines the 40th largest absolute value. For each color channel
  valqueue  vq;
  cnt=0;
  for (i=0;i<16384;i++) {
    if (cnt==40) {
      vals[40].d=cadata1[i];
      vq.push(vals[40]);
      vals[40]=vq.top();
      vq.pop();
    }
    else {
      vals[cnt].d=cadata1[i];
      vq.push(vals[cnt]);
      cnt++;
    }
  }
  truncq(cadata1,cdata1,vq.top().d,sig1);

  while(!vq.empty()) vq.pop();
  cnt=0;
  for (i=0;i<16384;i++) {
    if (cnt==40) {
      vals[40].d=cadata2[i];
      vq.push(vals[40]);
      vals[40]=vq.top();
      vq.pop();
    }
    else {
      vals[cnt].d=cadata2[i];
      vq.push(vals[cnt]);      
      cnt++;
    }
  }
  truncq(cadata2,cdata2,vq.top().d,sig2);

  while(!vq.empty()) vq.pop();
  cnt=0;
  for (i=0;i<16384;i++) {
    if (cnt==40) {
      vals[40].d=cadata3[i];
      vq.push(vals[40]);
      vals[40]=vq.top();
      vq.pop();
    }
    else {
      vals[cnt].d=cadata3[i];
      vq.push(vals[cnt]);      
      cnt++;
    }
  }
  truncq(cadata3,cdata3,vq.top().d,sig3);

  Safefree(cadata1);
  Safefree(cadata2);
  Safefree(cadata3);
  return 1;
}

haar.h  view on Meta::CPAN


typedef std::priority_queue < valStruct > valqueue;

#define max(a, b)  (((a) > (b)) ? (a) : (b))
#define min(a, b)  (((a) > (b)) ? (b) : (a))

void initImgBin();
void truncq(double* a,double* b,double limit,int* data);
void transform(double* a,double* b,double* c);
void transformChar(unsigned char* c1,unsigned char* c2,unsigned char* c3,double* a,double* b,double* c);
int calcHaar(double* cdata1,double* cdata2,double* cdata3,int* sig1,int* sig2,int* sig3,double * avgl);
double *absarray(double* a);

#endif

imgdb.cpp  view on Meta::CPAN

  /* id is a unique image identifier
     filename is the image location
     thname is the thumbnail location for this image
     doThumb should be set to 1 if you want to save the thumbnail on thname
     Images with a dimension smaller than ignDim are ignored
  */
  double* avgl = (double*)safesysmalloc(3*sizeof(double));
  int* sig1;
  int* sig2;
  int* sig3;
  double* cdata1, * cdata2, * cdata3;
  int i;
  New(200, cdata1, 16384, double);
  New(200, cdata2, 16384, double);
  New(200, cdata3, 16384, double);

  New(200, sig1, 40, int);
  New(200, sig2, 40, int);
  New(200, sig3, 40, int);

  sigStruct* nsig = new sigStruct();
  nsig->sig1 = sig1;
  nsig->sig2 = sig2;
  nsig->sig3 = sig3;
  nsig->avgl = avgl;
  nsig->id = id;

  transformChar(red, green, blue, cdata1,cdata2,cdata3);

  sigs[id] = nsig;

  calcHaar(cdata1,cdata2,cdata3,sig1,sig2,sig3,avgl);
  for (i = 0;i<40;i++) {         // populate buckets
    if (sig1[i]>0) imgbuckets[0][0][sig1[i]].push_back(id);
    if (sig1[i]<0) imgbuckets[0][1][-sig1[i]].push_back(id);

    if (sig2[i]>0) imgbuckets[1][0][sig2[i]].push_back(id);
    if (sig2[i]<0) imgbuckets[1][1][-sig2[i]].push_back(id);

    if (sig3[i]>0) imgbuckets[2][0][sig3[i]].push_back(id);
    if (sig3[i]<0) imgbuckets[2][1][-sig3[i]].push_back(id);   
  }

  free(cdata1);
  free(cdata2);
  free(cdata3);

  return 1;
}

/* Data:
    buckets[3][2][16835]
    sigs (hash)
*/

int loaddb(char* filename) {



( run in 0.267 second using v1.01-cache-2.11-cpan-454fe037f31 )