From: <ste...@us...> - 2007-06-23 23:16:35
|
Revision: 2150 http://hugin.svn.sourceforge.net/hugin/?rev=2150&view=rev Author: stereo_sl Date: 2007-06-23 16:16:31 -0700 (Sat, 23 Jun 2007) Log Message: ----------- - implementation of scale-space - fixed some bugs(math related) Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-06-23 23:05:26 UTC (rev 2149) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-06-23 23:16:31 UTC (rev 2150) @@ -28,6 +28,7 @@ using namespace std; HessianDetector::HessianDetector(Image* i) { + this->image=i; determinants.resize(this->image->getHeightBW()); maximas.resize(this->image->getHeightBW()); @@ -49,22 +50,28 @@ bool HessianDetector::detect() { - int height = this->image->getHeightBW(); int width = this->image->getWidthBW(); - int kernelX=5; - int kernelY=5; - int scale=1.2; + int kernelX=9; + int kernelY=9; + double scale=1.2; - //TODO: larger kernels for scale-space(see main.java) - - int gxx[][5]={ - 1, 29, 90, 29, 1, + int gxx[][9]={ + /*1, 29, 90, 29, 1, 5, 133, 411, 133, 5, -11, -329, -1013, -329, -11, 5, 133, 411, 133, 5, - 1, 29, 90, 29, 1 + 1, 29, 90, 29, 1*/ + 1, 7, 29, 68, 90, 68, 29, 7, 1, //9x9 gauss kernels + 4, 26, 106, 247, 327, 247, 106, 26, 4, + 5, 33, 133, 310, 411, 310, 133, 33, 5, + -4, -27, -109, -252, -335, -252, -109, -27, -4, + -11, -81, -329, -765, -1013, -765, -329, -81, -11, + -4, -27, -109, -252, -335, -252, -109, -27, -4, + 5, 33, 133, 310, 411, 310, 133, 33, 5, + 4, 26, 106, 247, 327, 247, 106, 26, 4, + 1, 7, 29, 68, 90, 68, 29, 7, 1 /*0,0,1,1,1,1,1,0,0, //box filters 9x9 0,0,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,0,0, @@ -76,19 +83,47 @@ 0,0,1,1,1,1,1,0,0*/ }; - int gyy[][5]={ - 1, 5, -11, 5, 1, + int gyy[][9]={ + /*1, 5, -11, 5, 1, 29, 133, -329, 133, 29, 90, 411, -1013, 411, 90, 29, 133, -329, 133, 29, - 1, 5, -11, 5, 1}; + 1, 5, -11, 5, 1*/ + 1, 4, 5, -4, -11, -4, 5, 4, 1, + 7, 26, 33, -27, -81, -27, 33, 26, 7, + 29, 106, 133, -109, -329, -109, 133, 106, 29, + 68, 247, 310, -252, -765, -252, 310, 247, 68, + 90, 327, 411, -335, -1013, -335, 411, 327, 90, + 68, 247, 310, -252, -765, -252, 310, 247, 68, + 29, 106, 133, -109, -329, -109, 133, 106, 29, + 7, 26, 33, -27, -81, -27, 33, 26, 7, + 1, 4, 5, -4, -11, -4, 5, 4, 1 + /*0,0,0,0,0,0,0,0,0, //box filters 9x9 + 0,0,0,0,0,0,0,0,0, + 1,1,1,-2,-2,-2,1,1,1, + 1,1,1,-2,-2,-2,1,1,1, + 1,1,1,-2,-2,-2,1,1,1, + 1,1,1,-2,-2,-2,1,1,1, + 1,1,1,-2,-2,-2,1,1,1, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0*/ + }; - int gxy[][5]={ - 1, 15, 0, -15, -1, + int gxy[][9]={ + /*1, 15, 0, -15, -1, 15, 214, 0, -214, -15, 0, 0, 0, 0, 0, -15, -214, 0, 214, 15, - -1, -15, 0, 15, 1 + -1, -15, 0, 15, 1*/ + 1, 5, 15, 17, 0, -17, -15, -5, -1, + 5, 29, 78, 91, 0, -91, -78, -29, -5, + 15, 78, 214, 248, 0, -248, -214, -78, -15, + 17, 91, 248, 289, 0, -289, -248, -91, -17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + -17, -91, -248, -289, 0, 289, 248, 91, 17, + -15, -78, -214, -248, 0, 248, 214, 78, 15, + -5, -29, -78, -91, 0, 91, 78, 29, 5, + -1, -5, -15, -17, 0, 17, 15, 5, 1 /*0,0,0,0,0,0,0,0,0, 0,1,1,1,0,-1,-1,-1,0, 0,1,1,1,0,-1,-1,-1,0, @@ -104,28 +139,34 @@ int offsetY=floor(kernelY/2); int xStart=0; int yStart=0; - double pixelSumYY=0; - double pixelSumXX=0; - double pixelSumXY=0; - bool outOfRange=false; + double pixelSumYY; + double pixelSumXX; + double pixelSumXY; + int tmpX=0; int tmpY=0; int val; + double mappingX; + double mappingY; - double det=0; + double det; + double max=0; - - for(int s=1; s<2;s+=1.0) { //scale-space loop + for(int s=0; s<6;s+=1.0) { //scale-space loop cout << s << "\n"; - + height=image->getHeightBW(); + width=image->getWidthBW(); + cout << height << "," << width << " \n"; + cout << " "; for(int i=0;i<height;i++) { for(int j=0; j<width;j++) { pixelSumYY=0; pixelSumXX=0; pixelSumXY=0; + xStart=i-offsetX; + yStart=j-offsetY; - yStart=j-offsetY; for(int k=0;k<kernelX;k++) { tmpX=xStart+k; if(tmpX<0) tmpX=height+tmpX; @@ -135,30 +176,33 @@ tmpY=yStart+l; if(tmpY<0) tmpY=width+tmpY; - if(tmpY>=height) tmpY=tmpY-height; - //cout << "(" << tmpX<< "," <<tmpY <<") "; - val=image->getPixel(tmpX,tmpY); - pixelSumYY+=0.01*gyy[k][l]*val; - pixelSumXX+=0.01*gxx[k][l]*val; - pixelSumXY+=0.01*gxy[k][l]*val; - //cout << " "<< pixelSumXX; - //} + val=image->getPixel(tmpX,tmpY); + + pixelSumYY+=0.001*gyy[k][l]*val; + pixelSumXX+=0.001*gxx[k][l]*val; + pixelSumXY+=0.001*gxy[k][l]*val; } } - //cout << "\n\n"; //determinant of the Hessian Matrix det = pixelSumXX*pixelSumYY-pow((pixelSumXY),2); - //cout << det << " "; - if(det>determinants[i][j]) { - determinants[i][j]=det; - maximas[i][j]=s; + + //map coordinates on the scaled image onto coordinates on the original image + mappingX=round(i*pow(scale,s)); + mappingY=round(j*pow(scale,s)); + + if(det>determinants[mappingX][mappingY]) { + if(det>max) max=det; + + determinants[mappingX][mappingY]=det; + maximas[mappingX][mappingY]=s; } } //cout << "\n"; } + image->scale(scale); } //scale-space //TODO: @@ -188,31 +232,26 @@ if(p==0) deg=0; else deg=atan(q/p)* 180 / PI; + if(deg<0) deg=360+deg; + //cout << "(" << m[i][j]<< "," << deg <<") "; + //cout << maximas[i][j] <<" "; tmp=(int)deg/22.5; //sector(orientation) switch(tmp) { case 0: - case 7: - case 8: case 15: a[i][j]=0; break; - case 5: - case 6: - case 9: - case 10: + case 1: + case 2: a[i][j]=1; break; case 3: - case 4: - case 11: case 12: a[i][j]=2; break; - case 1: - case 2: case 13: case 14: a[i][j]=3; @@ -223,7 +262,7 @@ //cout << "\n"; } - int threshold=50000; + int threshold=0.15*max; for(int i=3;i<(image->getHeight()-1);i++) { /*if(i==0) tmpX=height+tmpX; @@ -240,23 +279,23 @@ switch(a[i][j]) { case 0: if(m[i][j]>m[i-1][j] && m[i][j]>m[i+1][j] && determinants[i][j]>threshold) { - image->drawCircle(j,i,(int)1*maximas[i][j]); + image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); } break; case 1: if(m[i][j]>m[i-1][j+1] && m[i][j]>m[i+1][j-1] &&determinants[i][j]>threshold) { - image->drawCircle(j,i,(int)1*maximas[i][j]); + image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); } break; case 2: if(m[i][j]>m[i-1][j] && m[i][j]>m[i+1][j] && determinants[i][j]>threshold) { - image->drawCircle(j,i,(int)1*maximas[i][j]); + image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); } break; case 3: if(m[i][j]>m[i-1][j-1] && m[i][j]>m[i+1][j+1] && determinants[i][j]>threshold) { - image->drawCircle(j,i,(int)1*maximas[i][j]); + image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); } break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |