Image-Seek
view release on metacpan or search on metacpan
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;
}
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
/* 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 )