From: <ste...@us...> - 2007-08-21 20:04:39
|
Revision: 2414 http://hugin.svn.sourceforge.net/hugin/?rev=2414&view=rev Author: stereo_sl Date: 2007-08-21 13:04:32 -0700 (Tue, 21 Aug 2007) Log Message: ----------- - replaced OpenCV library with vigra, because vigra is used in hugin - TODO: merge with previous revisions to allow usage of both libraries Modified Paths: -------------- gsoc07_featuredetection/FeatureMatching.cpp gsoc07_featuredetection/Image.cpp gsoc07_featuredetection/Image.h Modified: gsoc07_featuredetection/FeatureMatching.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatching.cpp 2007-08-20 22:52:19 UTC (rev 2413) +++ gsoc07_featuredetection/FeatureMatching.cpp 2007-08-21 20:04:32 UTC (rev 2414) @@ -17,9 +17,9 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#define USE_OPENCV -//#define USE_QT 1 -//#define USE_VIGRA 1 +//#define USE_OPENCV +//#define USE_QT +#define USE_VIGRA #ifdef HAVE_CONFIG_H #include <config.h> @@ -162,7 +162,7 @@ cout << "Matching..."<<endl; FeatureMatcher fm(20, &d1, &d2, FM_SECOND_NN); - fm.match(0.7); + fm.match(0.5); vector<vector<int> > cps=fm.getCtrlPoints(); cout << "...matching ended." << endl; @@ -174,8 +174,8 @@ for(int i=0; i<size; i++) { cout << cps[i][0] << "\t" << cps[i][1] << "\t" << ":" << "\t" << cps[i][2] << "\t" << cps[i][3] << endl ; - im1.drawCircle(cps[i][2],cps[i][3],10); - im2.drawCircle(cps[i][0],cps[i][1],10); + im1.drawCircle(cps[i][3],cps[i][2],10); + im2.drawCircle(cps[i][1],cps[i][0],10); } im1.show(); im2.show(); Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-08-20 22:52:19 UTC (rev 2413) +++ gsoc07_featuredetection/Image.cpp 2007-08-21 20:04:32 UTC (rev 2414) @@ -20,16 +20,10 @@ #include <string> #include <math.h> #include "Image.h" -#include <cv.h> -#include <highgui.h> -/*#include "vigra/stdimage.hxx" -#include "vigra/imageinfo.hxx" -#include "vigra/impex.hxx" -#include "vigra/convolution.hxx" -#include "vigra/inspectimage.hxx" -#include "vigra/stdimagefunctions.hxx"*/ -using namespace std; +#ifdef USE_VIGRA + using namespace vigra; +#endif Image::Image(string p) { this->path=p; @@ -37,22 +31,68 @@ bool Image::open() { - this->img=0; - this->img=cvLoadImage(this->path.c_str(),1); +#ifdef USE_VIGRA + try + { + // read image given as first argument + // file type is determined automatically + ImageImportInfo info(this->path.c_str()); + //cout << this->path.c_str() << "Size:"<< info.width() <<"\n"; - if(!img) return false; - else { - this->imgBW=cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1); - if(!imgBW) return false; + if(info.isGrayscale()) + { + // create a gray scale image of appropriate size + vigra::BImage in(info.width(), info.height()); + this->imgBW=new BImage(info.width(), info.height()); + // import the image just read + importImage(info, destImage(*this->imgBW)); + } + else + { - cvCvtColor(img,imgBW,CV_BGR2GRAY); // cimg -> gimg - if(!imgBW) return false; - else return true; + //BRGBImage in(info.width(), info.height()); + this->imgBW=new BImage(info.width(), info.height()); + + importImage(info, destImage(*this->imgBW)); + + + //copyImage(srcImageRange(in), destImage(*this->imgBW)); + + /*if(strcmp("test.jpg", "-") == 0) + { + // write stdout + exportImage(srcImageRange(out), + + vigra::ImageExportInfo("test.jpg").setFileType(info.getFileType())); + } + else + { + exportImage(srcImageRange(in), vigra::ImageExportInfo("test.jpg")); + }*/ + + // create a RGB image of appropriate size + //vigra::BRGBImage in(info.width(), info.height()); + + //this->imageBW(info.width(), info.height()); + // import the image just read + // importImage(info, destImage(imageRGB)); + //importImage(info, destImage(this->imageBW)); + // write the image to the file given as second argument + // the file type will be determined from the file name's extension + //exportImage(srcImageRange(this->imageRGB), vigra::ImageExportInfo("aaa.jpg"));*/ + } + return true; } + catch (vigra::StdException & e) + { + // catch any errors that might have occured and print their reason + return false; + } +#endif } void Image::convolute(int* kernel,int dim1, int dim2,double scale) { - CvScalar s; + /*CvScalar s; int offsetX=floor(dim1/2); int offsetY=floor(dim2/2); int xStart=0; @@ -67,12 +107,12 @@ for(int i=0;i<imgBW->height;i++) { for(int j=0; j<imgBW->width;j++) { //s=cvGet2D(imgBW,i,j); - /*outOfRange=true; + outOfRange=true; if(j-offsetX<0) { outOfRange=true; } if(i-offsetX<0) -*/ + pixelSum=0; xStart=i-offsetX; yStart=j-offsetY; @@ -102,54 +142,59 @@ // cvSet2D(imgBW,i,j,s); // set the (i,j) pixel value } //out << "\n"; - } + }*/ } int Image::getPixel(int x,int y) { - CvScalar s=cvGet2D(imgBW,x,y); - return s.val[0]; +#ifdef USE_VIGRA + return (*this->imgBW)(x,y); +#endif +#ifdef USE_OPENCV + CvScalar s=cvGet2D(imgBW,x,y); + s.val[0]; +#endif } int Image::getWidth() { - return this->img->width; + return this->imgBW->width(); } int Image::getWidthBW() { - return this->imgBW->width; + return this->imgBW->width(); } int Image::getHeight() { - return this->img->height; + return this->imgBW->height(); } int Image::getHeightBW() { - return this->imgBW->height; + return this->imgBW->height(); } Image* Image::getCopy() { return new Image(""); } void Image::scale(double factor) { //#ifdef USE_OPENCV - IplImage *resized= cvCreateImage(cvSize(round(this->getWidthBW()/factor),round(this->getHeightBW()/factor)), imgBW->depth ,imgBW->nChannels); + /*IplImage *resized= cvCreateImage(cvSize(round(this->getWidthBW()/factor),round(this->getHeightBW()/factor)), imgBW->depth ,imgBW->nChannels); cvResize(imgBW,resized); - this->imgBW=resized; + this->imgBW=resized;*/ //#endif } void Image::show() { - cvNamedWindow( "Image view", 1 ); + /* cvNamedWindow( "Image view", 1 ); cvShowImage( "Image view", this->img); cvWaitKey(0); // very important, contains event processing loop inside - cvDestroyWindow( "Image view" ); + cvDestroyWindow( "Image view" );*/ //cvReleaseImage( &img ); } void Image::drawCircle(int x,int y, int radius) { //cout << "Circle:" << x << "," << y << ",radius:"<<radius<<"\n"; - cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); - cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1); + /*cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); + cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1);*/ } void Image::drawRectangle(int x,int y, int radius) { - cvRectangle(this->img,cvPoint(x-radius,y-radius),cvPoint(x+radius,y+radius),cvScalar(0,255,0)); + //cvRectangle(this->img,cvPoint(x-radius,y-radius),cvPoint(x+radius,y+radius),cvScalar(0,255,0)); } void Image::drawLine(int x1,int y1, int x2,int y2) { //cout << "Draw line:("<< x1<< ","<<y1<<")->("<<x2<<","<<y2<<")\n"; - cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); + //cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); } void Image::smooth() { @@ -159,14 +204,26 @@ * Calculates the integral image */ void Image::integrate() { + + cout << "Height:"<< this->getHeightBW() <<"\n"; + cout << "Width:"<< this->getWidthBW() <<"\n"; + + int height = this->getHeightBW()-1; + int width = this->getWidthBW()-1; + this->integral.clear(); this->integral.resize(this->getHeightBW()); - for(int i=0;i<this->getHeightBW();i++) { + for(int i=0;i<height;i++) { this->integral[i].resize(this->getWidthBW()); - for(int j=0; j<this->getWidthBW();j++) { + for(int j=0; j<width;j++) { + //cout << i << ","<< j<<"\n"; this->integral[i][j]=this->_getValue4Integral(i,j-1)+this->_getValue4Integral(i-1,j)+this->getPixel(i,j)-this->_getValue4Integral(i-1,j-1); } + //cout << "\n"; } + cout << "EOF integration\n"; + + } int Image::_getValue4Integral(int x, int y) { if(x==-1 || y==-1) return 0; @@ -189,4 +246,3 @@ string Image::getPath() { return this->path; } - Modified: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h 2007-08-20 22:52:19 UTC (rev 2413) +++ gsoc07_featuredetection/Image.h 2007-08-21 20:04:32 UTC (rev 2414) @@ -19,18 +19,28 @@ ***************************************************************************/ #ifndef IMAGE_H_INCLUDED #define IMAGE_H_INCLUDED +#define USE_VIGRA + #include <string> #include <stdio.h> #include <iostream> #include <stdlib.h> #include <vector> + +#ifdef USE_OPENCV #include "cv.h" -/*#include "vigra/stdimage.hxx" -#include "vigra/impex.hxx"*/ +#endif +#ifdef USE_VIGRA +#include "vigra/stdimage.hxx" +#include "vigra/imageinfo.hxx" +#include "vigra/impex.hxx" +#include "vigra/stdimagefunctions.hxx" +#endif + + using namespace std; - class Image { @@ -70,10 +80,12 @@ vector<vector<int> > integral; string path; int _getValue4Integral(int x, int y); +#ifdef USE_VIGRA + vigra::BImage* imgBW; +#endif + /*IplImage* img; + IplImage* imgBW;*/ - IplImage* img; - IplImage* imgBW; - }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-22 21:39:51
|
Revision: 2415 http://hugin.svn.sourceforge.net/hugin/?rev=2415&view=rev Author: stereo_sl Date: 2007-08-22 14:39:45 -0700 (Wed, 22 Aug 2007) Log Message: ----------- - fixed issues with vigra - fixed issues with vector capacity(segmentation fault occured when more than thousand points were detected) Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/Image.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-21 20:04:32 UTC (rev 2414) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-22 21:39:45 UTC (rev 2415) @@ -33,8 +33,12 @@ this->nrPoints=nrPoints; this->nrOctaves=octaves; this->convolutionType = type; - this->orderedList; + vector<int> point; + point.resize(2); + + this->orderedList.reserve(sizeof(point)*nrPoints); + //initialize the vectors determinants.resize(this->image->getHeightBW()); maximas.resize(this->image->getHeightBW()); @@ -155,7 +159,7 @@ } //determinant of the Hessian Matrix - det = pixelSumXX*pixelSumYY-pow((pixelSumXY),2); + det = pixelSumXX*pixelSumYY-pow((double)pixelSumXY,2.0); //map coordinates on the scaled image onto coordinates on the original image mappingX=round(i*pow(scale,s)); @@ -222,9 +226,13 @@ } bool HessianDetector::_boxFilterDetect() { - int height = this->image->getHeightBW()-1; - int width = this->image->getWidthBW()-1; + int height = this->image->getHeightBW(); + int width = this->image->getWidthBW(); + cout << "Height:"<<height << ",width:"<<width<<endl; + cout << "Max vector size:"<< orderedList.max_size() << ", capacity:" << orderedList.capacity() << "\n"; + + const int iMax=std::numeric_limits<int>::max(); //TODO: @@ -244,6 +252,12 @@ } } + cout << "calculated maximas"<< "\n"; + + vector<vector<int> >::iterator it; + + it = orderedList.begin(); + for(int i=xStart;i<xEnd;i++) { for(int j=yStart; j<yEnd;j++) { /**Non-maxima suppression @@ -253,6 +267,7 @@ * This can also be done in a loop. * */ + if(determinants[i][j]>determinants[i-1][j-1] && determinants[i][j]>determinants[i-1][j] && determinants[i][j]>determinants[i-1][j+1] && @@ -260,13 +275,25 @@ determinants[i][j]>determinants[i][j+1] && determinants[i][j]>determinants[i+1][j-1] && determinants[i][j]>determinants[i+1][j] && - determinants[i][j]>determinants[i+1][j+1] ) { + determinants[i][j]>determinants[i+1][j+1]) { this->_insertToList(&i,&j); + /*cout << maximas[i][j]<<","<<determinants[i][j]<< ";"; + cout << i<<","<<j<< "\n";*/ + /*vector<int> point; + point.resize(2); + + point[0]=i; + point[1]=j; + + this->orderedList.push_back(point); + //it = orderedList.insert ( it , point); +*/ } //cout << maximas[i][j]<<","<<determinants[i][j]<< " "; } //cout << "\n"; } + cout << "Detected points:"<< this->orderedList.size() <<" "; return true; } @@ -586,22 +613,29 @@ //cout << c <<"\n"; } void HessianDetector::printPoints(std::ostream & o) { + cout << "Print HD points"<<endl; + vector<vector<int> >::iterator iter1 = orderedList.begin(); int n=0; + +/* while( iter1 != orderedList.end()) { n++; iter1++; - } + }*/ o << 1 << endl; - o << n << endl; + o << this->orderedList.size() << endl; iter1 = orderedList.begin(); //int c=0; while( iter1 != orderedList.end()) { vector<int > tmp2=*iter1; - double r = getMaxima(tmp2[0], tmp2[1])*HD_INIT_KERNEL_SIZE; + //double r = getMaxima(tmp2[0], tmp2[1])*HD_INIT_KERNEL_SIZE; + double r = 1; o <<tmp2[1]<<" "<<tmp2[0]<<" "<< " " << 1/(r*r) << " " << 0 << " " << 1/(r*r) << endl; iter1++; } + cout << "EOF Print HD points"<<endl; + } vector<vector<int> >* HessianDetector::getPoints() { Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-08-21 20:04:32 UTC (rev 2414) +++ gsoc07_featuredetection/Image.cpp 2007-08-22 21:39:45 UTC (rev 2415) @@ -146,7 +146,7 @@ } int Image::getPixel(int x,int y) { #ifdef USE_VIGRA - return (*this->imgBW)(x,y); + return (*this->imgBW)(y,x); #endif #ifdef USE_OPENCV CvScalar s=cvGet2D(imgBW,x,y); @@ -176,17 +176,37 @@ //#endif } void Image::show() { - /* cvNamedWindow( "Image view", 1 ); - cvShowImage( "Image view", this->img); - cvWaitKey(0); // very important, contains event processing loop inside - cvDestroyWindow( "Image view" );*/ +#ifdef USE_VIGRA + string add = "00det_"; + add.append(this->getPath()); + + cout << "Results:"<< add << endl; + exportImage(srcImageRange(*this->imgBW), ImageExportInfo(add.c_str())); +#endif +#ifdef USE_OPENCV + cvNamedWindow( "Image view", 1 ); + cvShowImage( "Image view", this->img); + cvWaitKey(0); // very important, contains event processing loop inside + cvDestroyWindow( "Image view" ); +#endif //cvReleaseImage( &img ); } void Image::drawCircle(int x,int y, int radius) { //cout << "Circle:" << x << "," << y << ",radius:"<<radius<<"\n"; +#ifdef USE_VIGRA + (*this->imgBW)(y,x) = 255; + (*this->imgBW)(y+1,x+1) = 255; + (*this->imgBW)(y-1,x-1) = 255; + (*this->imgBW)(y-1,x) = 255; + (*this->imgBW)(y,x-1) = 255; +#endif - /*cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); - cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1);*/ + +#ifdef USE_OPENCV + cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); + cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1); +#endif + } void Image::drawRectangle(int x,int y, int radius) { //cvRectangle(this->img,cvPoint(x-radius,y-radius),cvPoint(x+radius,y+radius),cvScalar(0,255,0)); @@ -194,7 +214,10 @@ void Image::drawLine(int x1,int y1, int x2,int y2) { //cout << "Draw line:("<< x1<< ","<<y1<<")->("<<x2<<","<<y2<<")\n"; - //cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); +#ifdef USE_OPENCV + cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); +#endif + } void Image::smooth() { @@ -208,14 +231,11 @@ cout << "Height:"<< this->getHeightBW() <<"\n"; cout << "Width:"<< this->getWidthBW() <<"\n"; - int height = this->getHeightBW()-1; - int width = this->getWidthBW()-1; - this->integral.clear(); this->integral.resize(this->getHeightBW()); - for(int i=0;i<height;i++) { + for(int i=0;i<this->getHeightBW();i++) { this->integral[i].resize(this->getWidthBW()); - for(int j=0; j<width;j++) { + for(int j=0; j<this->getWidthBW();j++) { //cout << i << ","<< j<<"\n"; this->integral[i][j]=this->_getValue4Integral(i,j-1)+this->_getValue4Integral(i-1,j)+this->getPixel(i,j)-this->_getValue4Integral(i-1,j-1); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-23 22:09:35
|
Revision: 2419 http://hugin.svn.sourceforge.net/hugin/?rev=2419&view=rev Author: stereo_sl Date: 2007-08-23 15:09:28 -0700 (Thu, 23 Aug 2007) Log Message: ----------- - fixed issues with vigra - RGB image is now converted to grayscale - fixed issues with vector capacity(vector with control points) Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/FeatureMatcher.cpp gsoc07_featuredetection/FeatureMatcher.h gsoc07_featuredetection/FeatureMatching.cpp gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-23 22:09:28 UTC (rev 2419) @@ -177,13 +177,13 @@ } double Descriptor::_gaussWeighting(int x, int y, double stdev) { - return (1/(2*PI*pow(stdev,2)))*exp(-(pow(x,2)+pow(y,2))/(2*stdev)); +return (1/(2*PI*pow(stdev,2.0)))*exp(-(pow((double)x,2.0)+pow((double)y,2.0))/(2*stdev)); } double Descriptor::_getMaxima(int x,int y) { return this->hd->getMaxima(x,y); } double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { - return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); + return sqrt(pow((double)(x1-x2),2.0)+pow((double)(y1-y2),2.0)); } void Descriptor::_GaborResponse(int x,int y, double maxima, double* descriptor) { // @@ -201,346 +201,346 @@ //relative coordinates(from the center of the kernel) and weights //for points of local maxima for first gabor filter(x,y,weight) double gabor11[6][3]={ - -1,0,0.839304, - 1,0,-0.839304, - -3,0,-0.190826, - 3,0,0.190826, - -6,0,0.0105653, - 6,0,-0.0105653 + {-1,0,0.839304}, + {1,0,-0.839304}, + {-3,0,-0.190826}, + {3,0,0.190826}, + {-6,0,0.0105653}, + {6,0,-0.0105653} }; //second...orientation=0, wavelength=10 double gabor12[6][3]={ - -2,0,0.839304, - 2,0,-0.839304, - -7,0,-0.20568, - 7,0,0.20568, - -11,0,0.0133981, - 11,0,-0.0133981 + {-2,0,0.839304}, + {2,0,-0.839304}, + {-7,0,-0.20568}, + {7,0,0.20568}, + {-11,0,0.0133981}, + {11,0,-0.0133981} }; double gabor13[10][3]={ - -2,0,0.945959, - 2,0,-0.945959, - -6,0,-0.606531, - 6,0,0.606531, - -10,0,0.249352, - 10,0,-0.249352, - -13,0,0.0676238, - 13,0,-0.0676238, - -17,0,0.0127725, - 17,0,-0.0127725 + {-2,0,0.945959}, + {2,0,-0.945959}, + {-6,0,-0.606531}, + {6,0,0.606531}, + {-10,0,0.249352}, + {10,0,-0.249352}, + {-13,0,0.0676238}, + {13,0,-0.0676238}, + {-17,0,0.0127725}, + {17,0,-0.0127725} }; //orientation=PI/4, wavelength=5 double gabor21[6][3]={ - -1,-1,0.762278, - -3,-2,-0.201919, - 2,3,0.201919, - 1,1,0.762278, - 3,5,0.0134254, - -5,-3,-0.0134254 + {-1,-1,0.762278}, + {-3,-2,-0.201919}, + {2,3,0.201919}, + {1,1,0.762278}, + {3,5,0.0134254}, + {-5,-3,-0.0134254} }; //orientation=PI/4, wavelength=10 double gabor22[6][3]={ - -2,-1,0.844207, - 2,1,-0.844207, - -5,-4,-0.213173, - 5,4,0.213173, - -9,-7,0.013459, - 9,7,-0.013459 + {-2,-1,0.844207}, + {2,1,-0.844207}, + {-5,-4,-0.213173}, + {5,4,0.213173}, + {-9,-7,0.013459}, + {9,7,-0.013459} }; double gabor23[10][3]={ - -2,-1,0.935087, - 2,1,-0.935087, - -4,-4,-0.618035, - 4,4,0.618035, - -7,-7,0.255577, - 7,7,-0.255577, - -9,-10,-0.0736175, - 10,9,0.0736175, - -12,-12,0.0126482, - 12,12,-0.0126482 + {-2,-1,0.935087}, + {2,1,-0.935087}, + {-4,-4,-0.618035}, + {4,4,0.618035}, + {-7,-7,0.255577}, + {7,7,-0.255577}, + {-9,-10,-0.0736175}, + {10,9,0.0736175}, + {-12,-12,0.0126482}, + {12,12,-0.0126482} }; double gabor31[6][3]={ - 0,-1,0.839304, - 0,1,-0.839304, - 0,-3,-0.190826, - 0,3,0.190826, - 0,6,-0.0105653, - 0,-6,0.0105653 + {0,-1,0.839304}, + {0,1,-0.839304}, + {0,-3,-0.190826}, + {0,3,0.190826}, + {0,6,-0.0105653}, + {0,-6,0.0105653} }; double gabor32[6][3]={ - 0,2,-0.839304, - 0,7,0.20568, - 0,11,-0.0133981, - 0,-2,0.839304, - 0,-7,-0.20568, - 0,-11,0.0133981 + {0,2,-0.839304}, + {0,7,0.20568}, + {0,11,-0.0133981}, + {0,-2,0.839304}, + {0,-7,-0.20568}, + {0,-11,0.0133981} }; double gabor33[10][3]={ - 0,-2,0.945959, - 0,2,-0.945959, - 0,-6,-0.606531, - 0,6,0.606531, - 0,-10,0.249352, - 0,10,-0.249352, - 0,-13,-0.0676238, - 0,13,0.0676238, - 0,-17,-0.0127725, - 0,17,0.0127725 + {0,-2,0.945959}, + {0,2,-0.945959}, + {0,-6,-0.606531}, + {0,6,0.606531}, + {0,-10,0.249352}, + {0,10,-0.249352}, + {0,-13,-0.0676238}, + {0,13,0.0676238}, + {0,-17,-0.0127725}, + {0,17,0.0127725} }; double gabor41[6][3]={ - 1,-1,0.762278, - -2,+3,0.201919, - 2,-3,-0.201919, - -1,1,-0.762278, - 3,-5,0.0134254, - -3,5,-0.0134254 + {1,-1,0.762278}, + {-2,+3,0.201919}, + {2,-3,-0.201919}, + {-1,1,-0.762278}, + {3,-5,0.0134254}, + {-3,5,-0.0134254} }; double gabor42[6][3]={ - -1,2,-0.844207, - 2,-1,0.844207, - 4,-5,-0.213173, - -5,4,0.213173, - 8,-8,0.013459, - -8,8,-0.013459 + {-1,2,-0.844207}, + {2,-1,0.844207}, + {4,-5,-0.213173}, + {-5,4,0.213173}, + {8,-8,0.013459}, + {-8,8,-0.013459} }; double gabor43[10][3]={ - 2,-1,0.935087, - -1,2,-0.935087, - 4,-4,-0.618035, - -4,4,0.618035, - 7,-7,0.255577, - -7,7,-0.255577, - 9,-10,-0.0736175, - -10,9,0.0736175, - 12,-12,0.0126482, - -12,12,-0.0126482 + {2,-1,0.935087}, + {-1,2,-0.935087}, + {4,-4,-0.618035}, + {-4,4,0.618035}, + {7,-7,0.255577}, + {-7,7,-0.255577}, + {9,-10,-0.0736175}, + {-10,9,0.0736175}, + {12,-12,0.0126482}, + {-12,12,-0.0126482} }; //orientation PI/8 double gabor53[10][3]={ - -2,0,0.946801, - 2,0,-0.946801, - -5,-3,-0.619484, - 3,5,0.619484, - -7,-8,0.263348, - 8,7,-0.263348, - -12,-6,0.0735327, - 6,12,-0.0735327, - -15,-9,0.0133379, - 9,15,-0.0133379 + {-2,0,0.946801}, + {2,0,-0.946801}, + {-5,-3,-0.619484}, + {3,5,0.619484}, + {-7,-8,0.263348}, + {8,7,-0.263348}, + {-12,-6,0.0735327}, + {6,12,-0.0735327}, + {-15,-9,0.0133379}, + {9,15,-0.0133379} }; //orientation 3*(PI/8) double gabor63[10][3]={ - 0,-2,0.946801, - 0,2,-0.946801, - -3,-5,-0.619484, - 5,3,0.619484, - -8,-7,0.263348, - 7,8,-0.263348, - -6,-12,0.0735327, - 12,6,-0.0735327, - -9,-15,0.0133379, - 15,9,-0.0133379 + {0,-2,0.946801}, + {0,2,-0.946801}, + {-3,-5,-0.619484}, + {5,3,0.619484}, + {-8,-7,0.263348}, + {7,8,-0.263348}, + {-6,-12,0.0735327}, + {12,6,-0.0735327}, + {-9,-15,0.0133379}, + {15,9,-0.0133379} }; //orientation 5*PI/8 double gabor73[10][3]={ - 0,-2,0.946801, - 0,2,-0.946801, - 3,-5,-0.619484, - -3,5,0.619484, - 8,-7,0.263348, - -8,8,-0.263348, - 6,-12,0.0735327, - -6,12,-0.0735327, - 9,-15,0.0133379, - -9,15,-0.0133379 + {0,-2,0.946801}, + {0,2,-0.946801}, + {3,-5,-0.619484}, + {-3,5,0.619484}, + {8,-7,0.263348}, + {-8,8,-0.263348}, + {6,-12,0.0735327}, + {-6,12,-0.0735327}, + {9,-15,0.0133379}, + {-9,15,-0.0133379} }; //orientation 7*PI/8 double gabor83[10][3]={ - 2,0,0.946801, - -2,0,-0.946801, - 5,-3,-0.619484, - -5,3,0.619484, - 7,-8,0.263348, - -7,8,-0.263348, - 12,-6,0.0735327, - -12,6,-0.0735327, - 15,-9,0.0133379, - -15,9,-0.0133379 + {2,0,0.946801}, + {-2,0,-0.946801}, + {5,-3,-0.619484}, + {-5,3,0.619484}, + {7,-8,0.263348}, + {-7,8,-0.263348}, + {12,-6,0.0735327}, + {-12,6,-0.0735327}, + {15,-9,0.0133379}, + {-15,9,-0.0133379} }; //stdev=6, wavelength=4, phase=0, orientation=0 double gabor91[17][3]={ - -16,0, 0.0285655, - -14,0, -0.0657285, - -12,0, 0.135335, - -10,0, -0.249352, - -8,0, 0.411112, - -6,0, -0.606531, - -4,0, 0.800737, - -2,0, -0.945959, - 0,0, 1, - 16,0, 0.0285655, - 14,0, -0.0657285, - 12,0, 0.135335, - 10,0, -0.249352, - 8,0, 0.411112, - 6,0, -0.606531, - 4,0, 0.800737, - 2,0, -0.945959 + {-16,0, 0.0285655}, + {-14,0, -0.0657285}, + {-12,0, 0.135335}, + {-10,0, -0.249352}, + {-8,0, 0.411112}, + {-6,0, -0.606531}, + {-4,0, 0.800737}, + {-2,0, -0.945959}, + {0,0, 1}, + {16,0, 0.0285655}, + {14,0, -0.0657285}, + {12,0, 0.135335}, + {10,0, -0.249352}, + {8,0, 0.411112}, + {6,0, -0.606531}, + {4,0, 0.800737}, + {2,0, -0.945959} }; //stdev=6, wavelength=4, phase=0, orientation=PI/8 double gabor101[17][3]={ - -16,-3,0.0292416, - -14,-2, -0.0656082, - -12,-2, 0.138167, - -10,-2, -0.248923, - -8,-1, 0.404746, - -6,-1, -0.609707, - -4,-1, 0.787721, - -2,0, -0.926472, - 0,0, 1, - 16,3,0.0292416, - 14,2, -0.0656082, - 12,2, 0.138167, - 10,2, -0.248923, - 8,1, 0.404746, - 6,1, -0.609707, - 4,1, 0.787721, - 2,0, -0.926472, + {-16,-3,0.0292416}, + {-14,-2, -0.0656082}, + {-12,-2, 0.138167}, + {-10,-2, -0.248923}, + {-8,-1, 0.404746}, + {-6,-1, -0.609707}, + {-4,-1, 0.787721}, + {-2,0, -0.926472}, + {0,0, 1}, + {16,3,0.0292416}, + {14,2, -0.0656082}, + {12,2, 0.138167}, + {10,2, -0.248923}, + {8,1, 0.404746}, + {6,1, -0.609707}, + {4,1, 0.787721}, + {2,0, -0.926472} }; //stdev=6, wavelength=4, phase=0, orientation=PI/4 double gabor111[17][3]={ - -11,-11, 0.026607, - -10,-10, -0.0606333, - -9,-8, 0.134318, - -7,-7, -0.253187, - -6,-5, 0.405626, - -4,-4, -0.550271, - -3,-3, 0.722915, - -2,-1, -0.922342, - 0,0, 1, - 11,11, 0.026607, - 10,10, -0.0606333, - 8,9, 0.134318, - 7,7, -0.253187, - 5,6, 0.405626, - 4,4, -0.550271, - 3,3, 0.722915, - 1,2, -0.922342 + {-11,-11, 0.026607}, + {-10,-10, -0.0606333}, + {-9,-8, 0.134318}, + {-7,-7, -0.253187}, + {-6,-5, 0.405626}, + {-4,-4, -0.550271}, + {-3,-3, 0.722915}, + {-2,-1, -0.922342}, + {0,0, 1}, + {11,11, 0.026607}, + {10,10, -0.0606333}, + {8,9, 0.134318}, + {7,7, -0.253187}, + {5,6, 0.405626}, + {4,4, -0.550271}, + {3,3, 0.722915}, + {1,2, -0.922342} }; //3PI/8 double gabor121[17][3]={ - -5,-15, 0.0295778, - -5,-13, -0.0672137, - -2,-12, 0.138167, - -4,-9, -0.252577, - -1,-8, 0.404746, - -3,-5, -0.588397, - -1,-4, 0.787721, - -0,-2, -0.926472, - 0,0, 1, - 5,15, 0.0295778, - 5,13, -0.0672137, - 2,12, 0.138167, - 4,9, -0.252577, - 1,8, 0.404746, - 3,5, -0.588397, - 1,4, 0.787721, - 0,2, -0.926472 + {-5,-15, 0.0295778}, + {-5,-13, -0.0672137}, + {-2,-12, 0.138167}, + {-4,-9, -0.252577}, + {-1,-8, 0.404746}, + {-3,-5, -0.588397}, + {-1,-4, 0.787721}, + {-0,-2, -0.926472}, + {0,0, 1}, + {5,15, 0.0295778}, + {5,13, -0.0672137}, + {2,12, 0.138167}, + {4,9, -0.252577}, + {1,8, 0.404746}, + {3,5, -0.588397}, + {1,4, 0.787721}, + {0,2, -0.926472} }; double gabor131[17][3]={ - 0,-16, 0.0285655, - 0,-14, -0.0657285, - 0,-12, 0.135335, - 0,-10, -0.249352, - 0,-8, 0.411112, - 0,-6, -0.606531, - 0,-4, 0.800737, - 0,-2, -0.945959, - 0,0, 1, - 0,16, 0.0285655, - 0,14, -0.0657285, - 0,12, 0.135335, - 0,10, -0.249352, - 0,8, 0.411112, - 0,6, -0.606531, - 0,4, 0.800737, - 0,2, -0.945959 + {0,-16, 0.0285655}, + {0,-14, -0.0657285}, + {0,-12, 0.135335}, + {0,-10, -0.249352}, + {0,-8, 0.411112}, + {0,-6, -0.606531}, + {0,-4, 0.800737}, + {0,-2, -0.945959}, + {0,0, 1}, + {0,16, 0.0285655}, + {0,14, -0.0657285}, + {0,12, 0.135335}, + {0,10, -0.249352}, + {0,8, 0.411112}, + {0,6, -0.606531}, + {0,4, 0.800737}, + {0,2, -0.945959} }; //5PI/8 double gabor141[17][3]={ - 10,-13, 0.0296244, - 5,-14, -0.0672137, - 7,-10, 0.137794, - 4,-9, -0.252577, - 6,-6, 0.411811, - 1,-6, -0.606531, - 3,-3, 0.801129, - 3,-1, -0.93537, - 0,0, 1, - -10,13, 0.0296244, - -5,14, -0.0672137, - -7,10, 0.137794, - -4,9, -0.252577, - -6,6, 0.411811, - -1,6, -0.606531, - -3,-3, 0.801129, - -3,1, -0.93537 + {10,-13, 0.0296244}, + {5,-14, -0.0672137}, + {7,-10, 0.137794}, + {4,-9, -0.252577}, + {6,-6, 0.411811}, + {1,-6, -0.606531}, + {3,-3, 0.801129}, + {3,-1, -0.93537}, + {0,0, 1}, + {-10,13, 0.0296244}, + {-5,14, -0.0672137}, + {-7,10, 0.137794}, + {-4,9, -0.252577}, + {-6,6, 0.411811}, + {-1,6, -0.606531}, + {-3,-3, 0.801129}, + {-3,1, -0.93537} }; //6PI/8 double gabor151[17][3]={ - 11,-11, 0.026607, - 10,-10, -0.0606333, - 9,-8, 0.134318, - 7,-7, -0.253187, - 6,-5, 0.405626, - 4,-4, -0.550271, - 3,-3, 0.722915, - 2,-1, -0.922342, - 0,0, 1, - -11,11, 0.026607, - -10,10, -0.0606333, - -8,9, 0.134318, - -7,7, -0.253187, - -5,6, 0.405626, - -4,4, -0.550271, - -3,3, 0.722915, - -1,2, -0.922342 + {11,-11, 0.026607}, + {10,-10, -0.0606333}, + {9,-8, 0.134318}, + {7,-7, -0.253187}, + {6,-5, 0.405626}, + {4,-4, -0.550271}, + {3,-3, 0.722915}, + {2,-1, -0.922342}, + {0,0, 1}, + {-11,11, 0.026607}, + {-10,10, -0.0606333}, + {-8,9, 0.134318}, + {-7,7, -0.253187}, + {-5,6, 0.405626}, + {-4,4, -0.550271}, + {-3,3, 0.722915}, + {-1,2, -0.922342} }; double gabor161[17][3] = { - 15,-5, 0.0295778, - 13,-5, -0.0672137, - 12,-2, 0.138167, - 9,-4, -0.252577, - 8,-1, 0.404746, - 5,-3, -0.588397, - 4,-1, 0.787721, - 0,-2, -0.926472, - 0,0, 1, - -15,5, 0.0295778, - -13,5, -0.0672137, - -12,2, 0.138167, - -9,4, -0.252577, - -8,1, 0.404746, - -5,3, -0.588397, - -4,1, 0.787721, - -2,0, -0.926472 + {15,-5, 0.0295778}, + {13,-5, -0.0672137}, + {12,-2, 0.138167}, + {9,-4, -0.252577}, + {8,-1, 0.404746}, + {5,-3, -0.588397}, + {4,-1, 0.787721}, + {0,-2, -0.926472}, + {0,0, 1}, + {-15,5, 0.0295778}, + {-13,5, -0.0672137}, + {-12,2, 0.138167}, + {-9,4, -0.252577}, + {-8,1, 0.404746}, + {-5,3, -0.588397}, + {-4,1, 0.787721}, + {-2,0, -0.926472} }; @@ -706,6 +706,7 @@ } bool Descriptor::generateAutopanoXML(string name) { + cout << "Generating XML file: "<<name<<endl; ofstream xmlFile (name.c_str()); if (xmlFile.is_open()) { Modified: gsoc07_featuredetection/FeatureMatcher.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-23 22:09:28 UTC (rev 2419) @@ -30,6 +30,12 @@ this->descriptor2 = d2; this->matchingType = mt; this->nrControlPoints = nrCP; + + vector<int> point; + point.resize(2); + + this->controlPoints.reserve(sizeof(point)*this->nrControlPoints); + } void FeatureMatcher::match(double threshold) { @@ -39,6 +45,7 @@ vector<vector<double> >* descriptors2=this->descriptor2->getDescriptors(); int pointCount=0; + int cpCount=0; //matched points counter int max; int maxId; //position int the vector of the nearest neighbour @@ -78,17 +85,18 @@ if(diff<(threshold*diff2)) { controlPoint.clear(); - controlPoint.push_back((*this->descriptor2->interestPoints)[maxId][0]); controlPoint.push_back((*this->descriptor2->interestPoints)[maxId][1]); controlPoint.push_back((*this->descriptor1->interestPoints)[pointCount][0]); controlPoint.push_back((*this->descriptor1->interestPoints)[pointCount][1]); this->controlPoints.push_back(controlPoint); + cpCount++; } iter1++; pointCount++; } + this->nrControlPoints = cpCount; } /*void FeatureMatcher::printCtrlPoints() { vector<vector<int> >::iterator iter1 = this->controlPoints.begin(); @@ -102,6 +110,10 @@ vector<vector<int> > FeatureMatcher::getCtrlPoints() { return this->controlPoints; } +int FeatureMatcher::getNrPoints() { + return this->nrControlPoints; +} + double FeatureMatcher::_getDistance(vector<double>* d1,vector<double>* d2) { double dist=0; for(int i=0; i<DESCRIPTOR_SIZE;i++) { Modified: gsoc07_featuredetection/FeatureMatcher.h =================================================================== --- gsoc07_featuredetection/FeatureMatcher.h 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/FeatureMatcher.h 2007-08-23 22:09:28 UTC (rev 2419) @@ -34,6 +34,7 @@ void match(double threshold=0.7); //void addDescriptor(Descriptor* descriptor) vector<vector<int> > getCtrlPoints(); + int getNrPoints(); //void printCtrlPoints(); //void setPoints(vector<vector<double> >* desc); Modified: gsoc07_featuredetection/FeatureMatching.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatching.cpp 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/FeatureMatching.cpp 2007-08-23 22:09:28 UTC (rev 2419) @@ -70,7 +70,7 @@ string input2; bool generateXML=false; - int nrPoints = 1000; + int nrPoints = 4000; // parse arguments while ((c = getopt (argc, argv, optstring)) != -1) @@ -129,7 +129,8 @@ return 1; } //print points and display image with the detected points(debugging only) - //hd1.printPoints(); + /*hd1.printPoints(); + return 0;*/ finish = clock(); @@ -161,22 +162,33 @@ cout << "Matching..."<<endl; - FeatureMatcher fm(20, &d1, &d2, FM_SECOND_NN); + FeatureMatcher fm(nrPoints, &d1, &d2, FM_SECOND_NN); fm.match(0.5); - vector<vector<int> > cps=fm.getCtrlPoints(); + + vector<int> point; + point.resize(4); + + vector<vector<int> > cps; + cps.reserve(sizeof(point)*fm.getNrPoints()); + cps=fm.getCtrlPoints(); + cout << "...matching ended." << endl; int size = cps.size(); cout << "Nr of control points:"<< size <<endl; - cout << "Control points("; - cout << "x1\ty1\t:\tx2\ty2):"<<endl; + cout << "Control points:"<<endl; + cout << "(x1\ty1\t:\tx2\ty2)"<<endl; + vector<vector<int> >::iterator iter1 =cps.begin(); - for(int i=0; i<size; i++) { - cout << cps[i][0] << "\t" << cps[i][1] << "\t" << ":" << "\t" << cps[i][2] << "\t" << cps[i][3] << endl ; - im1.drawCircle(cps[i][3],cps[i][2],10); - im2.drawCircle(cps[i][1],cps[i][0],10); - } + while( iter1 != cps.end()) { + vector<int> current = *iter1; + cout << current[0] << "\t" << current[1] << "\t" << ":" << "\t" << current[2] << "\t" << current[3] << endl ; + im1.drawCircle(current[2],current[3],10); + im2.drawCircle(current[0],current[1],10); + iter1++; + } + im1.show(); im2.show(); } Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-23 22:09:28 UTC (rev 2419) @@ -230,7 +230,7 @@ int width = this->image->getWidthBW(); cout << "Height:"<<height << ",width:"<<width<<endl; - cout << "Max vector size:"<< orderedList.max_size() << ", capacity:" << orderedList.capacity() << "\n"; + //cout << "Max vector size:"<< orderedList.max_size() << ", capacity:" << orderedList.capacity() << "\n"; const int iMax=std::numeric_limits<int>::max(); @@ -252,8 +252,6 @@ } } - cout << "calculated maximas"<< "\n"; - vector<vector<int> >::iterator it; it = orderedList.begin(); Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/HessianDetector.h 2007-08-23 22:09:28 UTC (rev 2419) @@ -58,9 +58,9 @@ int nrPoints; int nrOctaves; CONVOLUTION_TYPE convolutionType; - vector<vector<int> > determinants; //holds the values of the hessian determinant for each pixel - vector<vector<int> > orderedList; //first n pixels with the largest determinant values - vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum + std::vector<vector<int> > determinants; //holds the values of the hessian determinant for each pixel + std::vector<vector<int> > orderedList; //first n pixels with the largest determinant values + std::vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); void _calculateMaxDet(int i, int j); //calculates scale-space maxima for pixel at coord i,j Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-08-23 16:10:50 UTC (rev 2418) +++ gsoc07_featuredetection/Image.cpp 2007-08-23 22:09:28 UTC (rev 2419) @@ -50,37 +50,46 @@ else { - //BRGBImage in(info.width(), info.height()); + BRGBImage in(info.width(), info.height()); + //TODO: this does not work. How to make a conversion from RGB to BW image in vigra??? this->imgBW=new BImage(info.width(), info.height()); - importImage(info, destImage(*this->imgBW)); + importImage(info, destImage(in)); + // create image iterator that points to upper left corner + // of source image + vigra::BRGBImage::Iterator sy = in.upperLeft(); - //copyImage(srcImageRange(in), destImage(*this->imgBW)); + // create image iterator that points past the lower right corner of + // source image (similarly to the past-the-end iterator in the STL) + vigra::BRGBImage::Iterator send = in.lowerRight(); - /*if(strcmp("test.jpg", "-") == 0) - { - // write stdout - exportImage(srcImageRange(out), + // create image iterator that points to upper left corner + // of destination image + vigra::BImage::Iterator dy = (*this->imgBW).upperLeft(); - vigra::ImageExportInfo("test.jpg").setFileType(info.getFileType())); - } - else + // iterate down the first column of the images + for(; sy.y != send.y; ++sy.y, ++dy.y) { - exportImage(srcImageRange(in), vigra::ImageExportInfo("test.jpg")); - }*/ + // create image iterator that points to the first + // pixel of the current row of the source image + vigra::BRGBImage::Iterator sx = sy; - // create a RGB image of appropriate size - //vigra::BRGBImage in(info.width(), info.height()); + // create image iterator that points to the first + // pixel of the current row of the destination image + vigra::BImage::Iterator dx = dy; - //this->imageBW(info.width(), info.height()); - // import the image just read - // importImage(info, destImage(imageRGB)); - //importImage(info, destImage(this->imageBW)); - // write the image to the file given as second argument - // the file type will be determined from the file name's extension - //exportImage(srcImageRange(this->imageRGB), vigra::ImageExportInfo("aaa.jpg"));*/ + // iterate across current row + for(; sx.x != send.x; ++sx.x, ++dx.x) + { + RGBValue<int,0u,1u,2u> pixel = *sx; + // calculate grayscale value + // Y = 0.3*R + 0.59*G + 0.11*B + *dx = vigra::round(0.3*pixel.red() + 0.59*pixel.green() + 0.11*pixel.blue()); + } + } + //exportImage(srcImageRange(*this->imgBW), vigra::ImageExportInfo("ttt.jpg")); } return true; } @@ -241,9 +250,6 @@ } //cout << "\n"; } - cout << "EOF integration\n"; - - } int Image::_getValue4Integral(int x, int y) { if(x==-1 || y==-1) return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-27 20:35:19
|
Revision: 2420 http://hugin.svn.sourceforge.net/hugin/?rev=2420&view=rev Author: stereo_sl Date: 2007-08-27 13:35:13 -0700 (Mon, 27 Aug 2007) Log Message: ----------- - renamed Image class to APImage, because libpano has this class Modified Paths: -------------- gsoc07_featuredetection/CMakeLists.txt gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/FeatureMatching.cpp gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/main.cpp Added Paths: ----------- gsoc07_featuredetection/APImage.cpp gsoc07_featuredetection/APImage.h Removed Paths: ------------- gsoc07_featuredetection/Image.cpp gsoc07_featuredetection/Image.h Added: gsoc07_featuredetection/APImage.cpp =================================================================== --- gsoc07_featuredetection/APImage.cpp (rev 0) +++ gsoc07_featuredetection/APImage.cpp 2007-08-27 20:35:13 UTC (rev 2420) @@ -0,0 +1,274 @@ +/*************************************************************************** + * Copyright (C) 2007 by Zoran Mesec * + * zor...@gm... * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include <string> +#include <math.h> +#include "APImage.h" + +#ifdef USE_VIGRA + using namespace vigra; +#endif + +APImage::APImage(string p) { +this->path=p; +} + +bool APImage::open() { + +#ifdef USE_VIGRA + try + { + // read image given as first argument + // file type is determined automatically + ImageImportInfo info(this->path.c_str()); + //cout << this->path.c_str() << "Size:"<< info.width() <<"\n"; + + if(info.isGrayscale()) + { + // create a gray scale image of appropriate size + vigra::BImage in(info.width(), info.height()); + this->imgBW=new BImage(info.width(), info.height()); + // import the image just read + importImage(info, destImage(*this->imgBW)); + } + else + { + + BRGBImage in(info.width(), info.height()); + + //TODO: this does not work. How to make a conversion from RGB to BW image in vigra??? + this->imgBW=new BImage(info.width(), info.height()); + + importImage(info, destImage(in)); + + // create image iterator that points to upper left corner + // of source image + vigra::BRGBImage::Iterator sy = in.upperLeft(); + + // create image iterator that points past the lower right corner of + // source image (similarly to the past-the-end iterator in the STL) + vigra::BRGBImage::Iterator send = in.lowerRight(); + + // create image iterator that points to upper left corner + // of destination image + vigra::BImage::Iterator dy = (*this->imgBW).upperLeft(); + + // iterate down the first column of the images + for(; sy.y != send.y; ++sy.y, ++dy.y) + { + // create image iterator that points to the first + // pixel of the current row of the source image + vigra::BRGBImage::Iterator sx = sy; + + // create image iterator that points to the first + // pixel of the current row of the destination image + vigra::BImage::Iterator dx = dy; + + // iterate across current row + for(; sx.x != send.x; ++sx.x, ++dx.x) + { + RGBValue<int,0u,1u,2u> pixel = *sx; + // calculate grayscale value + // Y = 0.3*R + 0.59*G + 0.11*B + *dx = vigra::round(0.3*pixel.red() + 0.59*pixel.green() + 0.11*pixel.blue()); + } + } + //exportAPImage(srcAPImageRange(*this->imgBW), vigra::APImageExportInfo("ttt.jpg")); + } + return true; + } + catch (vigra::StdException & e) + { + // catch any errors that might have occured and print their reason + return false; + } +#endif +} +void APImage::convolute(int* kernel,int dim1, int dim2,double scale) { + /*CvScalar s; + int offsetX=floor(dim1/2); + int offsetY=floor(dim2/2); + int xStart=0; + int yStart=0; + + double pixelSum=0; + // bool outOfRange=false; + int tmpX=0; + int tmpY=0; + double max=0; + + for(int i=0;i<imgBW->height;i++) { + for(int j=0; j<imgBW->width;j++) { + //s=cvGet2D(imgBW,i,j); + outOfRange=true; + if(j-offsetX<0) { + outOfRange=true; + } + if(i-offsetX<0) + + pixelSum=0; + xStart=i-offsetX; + yStart=j-offsetY; + for(int k=0;k<dim1;k++) { + tmpX=xStart+k; + for(int l=0;l<dim2;l++) { + tmpY=yStart+l; + if((tmpX)<0 ||tmpY<0 || tmpX>=imgBW->height || tmpY>=imgBW->width) { + pixelSum+=kernel[k*dim2+l]*(rand()%256); + } else { + + s=cvGet2D(imgBW,xStart+k,yStart+l); + //cout << " "<< s.val[0] << "\n"; + + pixelSum+=kernel[k*dim2+l]*s.val[0]; + } + //cout << "\nPixelSum:"<< pixelSum; + } + } + s.val[0]=pixelSum*0.004; + cvSet2D(imgBW,i,j,s); // set the (i,j) pixel value + if(pixelSum>max) max=pixelSum; + //cout << " "<< pixelSum; + //this->convolution[i][j]=pixelSum; + //s=cvGet2D(imgBW,i,j); +// s.val[0]=rand()%255; +// cvSet2D(imgBW,i,j,s); // set the (i,j) pixel value + } + //out << "\n"; + }*/ +} +int APImage::getPixel(int x,int y) { +#ifdef USE_VIGRA + return (*this->imgBW)(y,x); +#endif +#ifdef USE_OPENCV + CvScalar s=cvGet2D(imgBW,x,y); + s.val[0]; +#endif +} +int APImage::getWidth() { + return this->imgBW->width(); +} +int APImage::getWidthBW() { + return this->imgBW->width(); +} +int APImage::getHeight() { + return this->imgBW->height(); +} +int APImage::getHeightBW() { + return this->imgBW->height(); +} +APImage* APImage::getCopy() { + return new APImage(""); +} +void APImage::scale(double factor) { +//#ifdef USE_OPENCV + /*IplAPImage *resized= cvCreateAPImage(cvSize(round(this->getWidthBW()/factor),round(this->getHeightBW()/factor)), imgBW->depth ,imgBW->nChannels); + cvResize(imgBW,resized); + this->imgBW=resized;*/ +//#endif +} +void APImage::show() { +#ifdef USE_VIGRA + string add = "00det_"; + add.append(this->getPath()); + + cout << "Results:"<< add << endl; + exportImage(srcImageRange(*this->imgBW), ImageExportInfo(add.c_str())); +#endif +#ifdef USE_OPENCV + cvNamedWindow( "Image view", 1 ); + cvShowAPImage( "Image view", this->img); + cvWaitKey(0); // very important, contains event processing loop inside + cvDestroyWindow( "Image view" ); +#endif + //cvReleaseAPImage( &img ); +} +void APImage::drawCircle(int x,int y, int radius) { + //cout << "Circle:" << x << "," << y << ",radius:"<<radius<<"\n"; +#ifdef USE_VIGRA + (*this->imgBW)(y,x) = 255; + (*this->imgBW)(y+1,x+1) = 255; + (*this->imgBW)(y-1,x-1) = 255; + (*this->imgBW)(y-1,x) = 255; + (*this->imgBW)(y,x-1) = 255; +#endif + + +#ifdef USE_OPENCV + cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); + cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1); +#endif + +} +void APImage::drawRectangle(int x,int y, int radius) { + //cvRectangle(this->img,cvPoint(x-radius,y-radius),cvPoint(x+radius,y+radius),cvScalar(0,255,0)); +} + +void APImage::drawLine(int x1,int y1, int x2,int y2) { + //cout << "Draw line:("<< x1<< ","<<y1<<")->("<<x2<<","<<y2<<")\n"; +#ifdef USE_OPENCV + cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); +#endif + +} + +void APImage::smooth() { + //TODO: create a gaussian mask and call the function convolute +} +/** + * Calculates the integral image + */ +void APImage::integrate() { + + cout << "Height:"<< this->getHeightBW() <<"\n"; + cout << "Width:"<< this->getWidthBW() <<"\n"; + + this->integral.clear(); + this->integral.resize(this->getHeightBW()); + for(int i=0;i<this->getHeightBW();i++) { + this->integral[i].resize(this->getWidthBW()); + for(int j=0; j<this->getWidthBW();j++) { + //cout << i << ","<< j<<"\n"; + this->integral[i][j]=this->_getValue4Integral(i,j-1)+this->_getValue4Integral(i-1,j)+this->getPixel(i,j)-this->_getValue4Integral(i-1,j-1); + } + //cout << "\n"; + } +} +int APImage::_getValue4Integral(int x, int y) { +if(x==-1 || y==-1) return 0; +else return this->integral[x][y]; +} +int APImage::getIntegralPixel(int x,int y) { + return this->integral[x][y]; +} +int APImage::getRegionSum(int x1, int y1, int x2, int y2) { + if(x1<=0) x1=1; + if(y1<=0) y1=1; + if(x2<=0) x2=1; + if(y2<=0) y2=1; + if(x1>=this->getHeightBW()) x1=this->getHeightBW()-1; + if(x2>=this->getHeightBW()) x2=this->getHeightBW()-1; + if(y1>=this->getWidthBW()) y1=this->getWidthBW()-1; + if(y2>=this->getWidthBW()) y2=this->getWidthBW()-1; + return this->integral[x2][y2]+this->integral[x1-1][y1-1]-this->integral[x1-1][y2]-this->integral[x2][y1-1]; +} +string APImage::getPath() { + return this->path; +} Added: gsoc07_featuredetection/APImage.h =================================================================== --- gsoc07_featuredetection/APImage.h (rev 0) +++ gsoc07_featuredetection/APImage.h 2007-08-27 20:35:13 UTC (rev 2420) @@ -0,0 +1,92 @@ +/*************************************************************************** + * Copyright (C) 2007 by Zoran Mesec * + * zor...@gm... * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef IMAGE_H_INCLUDED +#define IMAGE_H_INCLUDED +#define USE_VIGRA + +#include <string> +#include <stdio.h> +#include <iostream> +#include <stdlib.h> +#include <vector> + +#ifdef USE_OPENCV +#include "cv.h" +#endif + +#ifdef USE_VIGRA +#include "vigra/stdimage.hxx" +#include "vigra/imageinfo.hxx" +#include "vigra/impex.hxx" +#include "vigra/stdimagefunctions.hxx" +#endif + + +using namespace std; + +class APImage + { + + public: + APImage(string p); + void convolute(int* kernel,int dim1, int dim2,double scale); + string getPath(); + int getWidth(); + int getWidthBW(); + int getHeight(); + int getHeightBW(); + int getPixel(int x, int y); + int getIntegralPixel(int x,int y); + void scale(double factor); + APImage* getCopy(); + void drawCircle(int x,int y, int radius); + void drawLine(int x1,int y1, int x2,int y2); + void drawRectangle(int x,int y, int radius); + void smooth(); + void integrate(); + int getRegionSum(int x1, int y1, int x2, int y2); + + bool open(); + void show(); + +/* private slots: +*/ + + private: + /** + * Holds the convolution of the image. + */ + vector<vector<int> > convolution; + /** + * Holds the values of the integral image. + */ + vector<vector<int> > integral; + string path; + int _getValue4Integral(int x, int y); +#ifdef USE_VIGRA + vigra::BImage* imgBW; +#endif + /*IplImage* img; + IplImage* imgBW;*/ + + }; + + +#endif // IMAGE_H_INCLUDED Modified: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/CMakeLists.txt 2007-08-27 20:35:13 UTC (rev 2420) @@ -12,12 +12,14 @@ ADD_DEFINITIONS(-Wall -O2 -g) #list all source files here -ADD_EXECUTABLE(main main.cpp Image.cpp HessianDetector.cpp Descriptor.cpp) +ADD_EXECUTABLE(main main.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp) #need to link to some other libraries ? just add them here -TARGET_LINK_LIBRARIES(main highgui cv cxcore png jpeg) +#TARGET_LINK_LIBRARIES(main highgui cv cxcore png jpeg) +TARGET_LINK_LIBRARIES(main vigraimpex png jpeg tiff) #list all source files here -ADD_EXECUTABLE(FeatureMatching FeatureMatching.cpp Image.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) +ADD_EXECUTABLE(FeatureMatching FeatureMatching.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) #need to link to some other libraries ? just add them here -TARGET_LINK_LIBRARIES(FeatureMatching highgui cv cxcore png jpeg) +#TARGET_LINK_LIBRARIES(FeatureMatching highgui cv cxcore png jpeg) +TARGET_LINK_LIBRARIES(FeatureMatching vigraimpex png jpeg tiff) Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-27 20:35:13 UTC (rev 2420) @@ -26,7 +26,7 @@ using namespace std; -Descriptor::Descriptor(Image* i,HessianDetector* hessianDetector) { +Descriptor::Descriptor(APImage* i,HessianDetector* hessianDetector) { this->image=i; this->hd=hessianDetector; } @@ -714,7 +714,7 @@ xmlFile << "<KeypointXMLList xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; xmlFile << " <XDim>"<< this->image->getHeight() <<"</XDim>"<< endl; xmlFile << " <YDim>"<< this->image->getWidth() <<"</YDim>"<< endl; - xmlFile << " <ImageFile>"<< this->image->getPath() <<"</ImageFile>"<< endl; + xmlFile << " <ImageFile>"<< this->image->getPath() <<"</APImageFile>"<< endl; xmlFile << " <Arr>"<< endl; vector<vector<int> >::iterator iter1 = interestPoints->begin(); Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/Descriptor.h 2007-08-27 20:35:13 UTC (rev 2420) @@ -21,7 +21,7 @@ #ifndef DESCRIPTOR_H_INCLUDED #define DESCRIPTOR_H_INCLUDED #include <string> -#include "Image.h" +#include "APImage.h" #include "HessianDetector.h" #define NR_ANGLE_BINS 8 @@ -30,7 +30,7 @@ class Descriptor { public: - Descriptor(Image* i, HessianDetector* hd); + Descriptor(APImage* i, HessianDetector* hd); double _gaussWeighting(int x, int y, double stdev); @@ -45,7 +45,7 @@ private: - Image* image; + APImage* image; HessianDetector* hd; double _getMaxima(int x,int y); Modified: gsoc07_featuredetection/FeatureMatching.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatching.cpp 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/FeatureMatching.cpp 2007-08-27 20:35:13 UTC (rev 2420) @@ -32,7 +32,7 @@ #include <ctime> #include <string> -#include "Image.h" +#include "APImage.h" #include "HessianDetector.h" #include "Descriptor.h" #include "FeatureMatcher.h" @@ -104,13 +104,13 @@ cout << "Number of detected points:" << nrPoints<<endl; - Image im1(input1); + APImage im1(input1); if(!im1.open()) { cout<< "Error! Image can not be opened"<<"\n"; return 0; } - Image im2(input2); + APImage im2(input2); if(!im2.open()) { cout<< "Error! Image can not be opened"<<"\n"; return 0; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-27 20:35:13 UTC (rev 2420) @@ -26,7 +26,7 @@ using namespace std; -HessianDetector::HessianDetector(Image* i, int nrPoints, CONVOLUTION_TYPE type, int octaves) { +HessianDetector::HessianDetector(APImage* i, int nrPoints, CONVOLUTION_TYPE type, int octaves) { if(octaves>HD_MAX_OCTAVES) return; // TODO (zoran#1#): Throw error or log status. this->image=i; Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/HessianDetector.h 2007-08-27 20:35:13 UTC (rev 2420) @@ -20,7 +20,7 @@ #ifndef HESSIANDETECTOR_H_ #define HESSIANDETECTOR_H_ -#include "Image.h" +#include "APImage.h" using namespace std; @@ -38,7 +38,7 @@ class HessianDetector { public: - HessianDetector(Image* i, int nrPoints=1000, CONVOLUTION_TYPE type=HD_BOX_FILTERS, int nrOctaves=1); + HessianDetector(APImage* i, int nrPoints=1000, CONVOLUTION_TYPE type=HD_BOX_FILTERS, int nrOctaves=1); bool detect(); void printPoints(); @@ -54,7 +54,7 @@ */ private: - Image* image; + APImage* image; int nrPoints; int nrOctaves; CONVOLUTION_TYPE convolutionType; Deleted: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/Image.cpp 2007-08-27 20:35:13 UTC (rev 2420) @@ -1,274 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Zoran Mesec * - * zor...@gm... * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#include <string> -#include <math.h> -#include "Image.h" - -#ifdef USE_VIGRA - using namespace vigra; -#endif - -Image::Image(string p) { -this->path=p; -} - -bool Image::open() { - -#ifdef USE_VIGRA - try - { - // read image given as first argument - // file type is determined automatically - ImageImportInfo info(this->path.c_str()); - //cout << this->path.c_str() << "Size:"<< info.width() <<"\n"; - - if(info.isGrayscale()) - { - // create a gray scale image of appropriate size - vigra::BImage in(info.width(), info.height()); - this->imgBW=new BImage(info.width(), info.height()); - // import the image just read - importImage(info, destImage(*this->imgBW)); - } - else - { - - BRGBImage in(info.width(), info.height()); - - //TODO: this does not work. How to make a conversion from RGB to BW image in vigra??? - this->imgBW=new BImage(info.width(), info.height()); - - importImage(info, destImage(in)); - - // create image iterator that points to upper left corner - // of source image - vigra::BRGBImage::Iterator sy = in.upperLeft(); - - // create image iterator that points past the lower right corner of - // source image (similarly to the past-the-end iterator in the STL) - vigra::BRGBImage::Iterator send = in.lowerRight(); - - // create image iterator that points to upper left corner - // of destination image - vigra::BImage::Iterator dy = (*this->imgBW).upperLeft(); - - // iterate down the first column of the images - for(; sy.y != send.y; ++sy.y, ++dy.y) - { - // create image iterator that points to the first - // pixel of the current row of the source image - vigra::BRGBImage::Iterator sx = sy; - - // create image iterator that points to the first - // pixel of the current row of the destination image - vigra::BImage::Iterator dx = dy; - - // iterate across current row - for(; sx.x != send.x; ++sx.x, ++dx.x) - { - RGBValue<int,0u,1u,2u> pixel = *sx; - // calculate grayscale value - // Y = 0.3*R + 0.59*G + 0.11*B - *dx = vigra::round(0.3*pixel.red() + 0.59*pixel.green() + 0.11*pixel.blue()); - } - } - //exportImage(srcImageRange(*this->imgBW), vigra::ImageExportInfo("ttt.jpg")); - } - return true; - } - catch (vigra::StdException & e) - { - // catch any errors that might have occured and print their reason - return false; - } -#endif -} -void Image::convolute(int* kernel,int dim1, int dim2,double scale) { - /*CvScalar s; - int offsetX=floor(dim1/2); - int offsetY=floor(dim2/2); - int xStart=0; - int yStart=0; - - double pixelSum=0; - // bool outOfRange=false; - int tmpX=0; - int tmpY=0; - double max=0; - - for(int i=0;i<imgBW->height;i++) { - for(int j=0; j<imgBW->width;j++) { - //s=cvGet2D(imgBW,i,j); - outOfRange=true; - if(j-offsetX<0) { - outOfRange=true; - } - if(i-offsetX<0) - - pixelSum=0; - xStart=i-offsetX; - yStart=j-offsetY; - for(int k=0;k<dim1;k++) { - tmpX=xStart+k; - for(int l=0;l<dim2;l++) { - tmpY=yStart+l; - if((tmpX)<0 ||tmpY<0 || tmpX>=imgBW->height || tmpY>=imgBW->width) { - pixelSum+=kernel[k*dim2+l]*(rand()%256); - } else { - - s=cvGet2D(imgBW,xStart+k,yStart+l); - //cout << " "<< s.val[0] << "\n"; - - pixelSum+=kernel[k*dim2+l]*s.val[0]; - } - //cout << "\nPixelSum:"<< pixelSum; - } - } - s.val[0]=pixelSum*0.004; - cvSet2D(imgBW,i,j,s); // set the (i,j) pixel value - if(pixelSum>max) max=pixelSum; - //cout << " "<< pixelSum; - //this->convolution[i][j]=pixelSum; - //s=cvGet2D(imgBW,i,j); -// s.val[0]=rand()%255; -// cvSet2D(imgBW,i,j,s); // set the (i,j) pixel value - } - //out << "\n"; - }*/ -} -int Image::getPixel(int x,int y) { -#ifdef USE_VIGRA - return (*this->imgBW)(y,x); -#endif -#ifdef USE_OPENCV - CvScalar s=cvGet2D(imgBW,x,y); - s.val[0]; -#endif -} -int Image::getWidth() { - return this->imgBW->width(); -} -int Image::getWidthBW() { - return this->imgBW->width(); -} -int Image::getHeight() { - return this->imgBW->height(); -} -int Image::getHeightBW() { - return this->imgBW->height(); -} -Image* Image::getCopy() { - return new Image(""); -} -void Image::scale(double factor) { -//#ifdef USE_OPENCV - /*IplImage *resized= cvCreateImage(cvSize(round(this->getWidthBW()/factor),round(this->getHeightBW()/factor)), imgBW->depth ,imgBW->nChannels); - cvResize(imgBW,resized); - this->imgBW=resized;*/ -//#endif -} -void Image::show() { -#ifdef USE_VIGRA - string add = "00det_"; - add.append(this->getPath()); - - cout << "Results:"<< add << endl; - exportImage(srcImageRange(*this->imgBW), ImageExportInfo(add.c_str())); -#endif -#ifdef USE_OPENCV - cvNamedWindow( "Image view", 1 ); - cvShowImage( "Image view", this->img); - cvWaitKey(0); // very important, contains event processing loop inside - cvDestroyWindow( "Image view" ); -#endif - //cvReleaseImage( &img ); -} -void Image::drawCircle(int x,int y, int radius) { - //cout << "Circle:" << x << "," << y << ",radius:"<<radius<<"\n"; -#ifdef USE_VIGRA - (*this->imgBW)(y,x) = 255; - (*this->imgBW)(y+1,x+1) = 255; - (*this->imgBW)(y-1,x-1) = 255; - (*this->imgBW)(y-1,x) = 255; - (*this->imgBW)(y,x-1) = 255; -#endif - - -#ifdef USE_OPENCV - cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); - cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1); -#endif - -} -void Image::drawRectangle(int x,int y, int radius) { - //cvRectangle(this->img,cvPoint(x-radius,y-radius),cvPoint(x+radius,y+radius),cvScalar(0,255,0)); -} - -void Image::drawLine(int x1,int y1, int x2,int y2) { - //cout << "Draw line:("<< x1<< ","<<y1<<")->("<<x2<<","<<y2<<")\n"; -#ifdef USE_OPENCV - cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); -#endif - -} - -void Image::smooth() { - //TODO: create a gaussian mask and call the function convolute -} -/** - * Calculates the integral image - */ -void Image::integrate() { - - cout << "Height:"<< this->getHeightBW() <<"\n"; - cout << "Width:"<< this->getWidthBW() <<"\n"; - - this->integral.clear(); - this->integral.resize(this->getHeightBW()); - for(int i=0;i<this->getHeightBW();i++) { - this->integral[i].resize(this->getWidthBW()); - for(int j=0; j<this->getWidthBW();j++) { - //cout << i << ","<< j<<"\n"; - this->integral[i][j]=this->_getValue4Integral(i,j-1)+this->_getValue4Integral(i-1,j)+this->getPixel(i,j)-this->_getValue4Integral(i-1,j-1); - } - //cout << "\n"; - } -} -int Image::_getValue4Integral(int x, int y) { -if(x==-1 || y==-1) return 0; -else return this->integral[x][y]; -} -int Image::getIntegralPixel(int x,int y) { - return this->integral[x][y]; -} -int Image::getRegionSum(int x1, int y1, int x2, int y2) { - if(x1<=0) x1=1; - if(y1<=0) y1=1; - if(x2<=0) x2=1; - if(y2<=0) y2=1; - if(x1>=this->getHeightBW()) x1=this->getHeightBW()-1; - if(x2>=this->getHeightBW()) x2=this->getHeightBW()-1; - if(y1>=this->getWidthBW()) y1=this->getWidthBW()-1; - if(y2>=this->getWidthBW()) y2=this->getWidthBW()-1; - return this->integral[x2][y2]+this->integral[x1-1][y1-1]-this->integral[x1-1][y2]-this->integral[x2][y1-1]; -} -string Image::getPath() { - return this->path; -} Deleted: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/Image.h 2007-08-27 20:35:13 UTC (rev 2420) @@ -1,92 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Zoran Mesec * - * zor...@gm... * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#ifndef IMAGE_H_INCLUDED -#define IMAGE_H_INCLUDED -#define USE_VIGRA - -#include <string> -#include <stdio.h> -#include <iostream> -#include <stdlib.h> -#include <vector> - -#ifdef USE_OPENCV -#include "cv.h" -#endif - -#ifdef USE_VIGRA -#include "vigra/stdimage.hxx" -#include "vigra/imageinfo.hxx" -#include "vigra/impex.hxx" -#include "vigra/stdimagefunctions.hxx" -#endif - - -using namespace std; - -class Image - { - - public: - Image(string p); - void convolute(int* kernel,int dim1, int dim2,double scale); - string getPath(); - int getWidth(); - int getWidthBW(); - int getHeight(); - int getHeightBW(); - int getPixel(int x, int y); - int getIntegralPixel(int x,int y); - void scale(double factor); - Image* getCopy(); - void drawCircle(int x,int y, int radius); - void drawLine(int x1,int y1, int x2,int y2); - void drawRectangle(int x,int y, int radius); - void smooth(); - void integrate(); - int getRegionSum(int x1, int y1, int x2, int y2); - - bool open(); - void show(); - -/* private slots: -*/ - - private: - /** - * Holds the convolution of the image. - */ - vector<vector<int> > convolution; - /** - * Holds the values of the integral image. - */ - vector<vector<int> > integral; - string path; - int _getValue4Integral(int x, int y); -#ifdef USE_VIGRA - vigra::BImage* imgBW; -#endif - /*IplImage* img; - IplImage* imgBW;*/ - - }; - - -#endif // IMAGE_H_INCLUDED Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-08-23 22:09:28 UTC (rev 2419) +++ gsoc07_featuredetection/main.cpp 2007-08-27 20:35:13 UTC (rev 2420) @@ -17,9 +17,9 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#define USE_OPENCV -//#define USE_QT 1 -//#define USE_VIGRA 1 +//#define USE_OPENCV +//#define USE_QT +#define USE_VIGRA #ifdef HAVE_CONFIG_H #include <config.h> @@ -33,7 +33,7 @@ #include <algorithm> #include <string> -#include "Image.h" +#include "APImage.h" #include "HessianDetector.h" #include "Descriptor.h" #include <limits> @@ -41,6 +41,7 @@ using namespace std; + double getDistance(vector<double>* d1,vector<double>* d2) { double dist=0; for(int i=0; i<DESCRIPTOR_SIZE;i++) { @@ -48,6 +49,7 @@ } return dist; } + int main(int argc, char *argv[]) { @@ -59,15 +61,16 @@ cout << "Usage: ./main img1 img2 " << "\n"; return 0; } - Image im1(argv[1]); + //APImage im1("trees/img1.ppm"); + APImage im1(argv[1]); if(!im1.open()) { - cout<< "Error! Image can not be opened"<<"\n"; + cout<< "Error! APImage can not be opened"<<"\n"; return 0; } - Image im2(argv[2]); + APImage im2(argv[2]); if(!im2.open()) { - cout<< "Error! Image can not be opened"<<"\n"; + cout<< "Error! APImage can not be opened"<<"\n"; return 0; } @@ -83,19 +86,23 @@ return 1; } //print points and display image with the detected points(debugging only) - //hd1.printPoints(); + //hd1.printPoints(cout); finish = clock(); time = (double(finish)-double(start))/CLOCKS_PER_SEC; cout << "Measured time:"<<time<<"\n"; + vector<vector<int> >* interestPoints1=hd1.getPoints(); Descriptor d1(&im1,&hd1); d1.setPoints(interestPoints1); //d.orientate(); d1.createDescriptors(); + //d1.generateAutopanoXML("test3.xml"); + /*d1.printDescriptors(cout); + return 0;*/ HessianDetector hd2(&im2,nrPoints, HD_BOX_FILTERS,1); if(!hd2.detect()) { @@ -112,6 +119,8 @@ d2.setPoints(interestPoints2); //d.orientate(); d2.createDescriptors(); + /*d2.generateAutopanoXML("test4.xml"); + return 0;*/ vector<vector<double> >* descriptors1=d1.getDescriptors(); vector<vector<double> >::iterator iter1 = (*descriptors1).begin(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-09-14 21:49:12
|
Revision: 2422 http://hugin.svn.sourceforge.net/hugin/?rev=2422&view=rev Author: dangelo Date: 2007-09-14 14:49:09 -0700 (Fri, 14 Sep 2007) Log Message: ----------- Added Feature extractor program Modified Paths: -------------- gsoc07_featuredetection/CMakeLists.txt Added Paths: ----------- gsoc07_featuredetection/FeatureExtractor.cpp Modified: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt 2007-09-14 09:57:29 UTC (rev 2421) +++ gsoc07_featuredetection/CMakeLists.txt 2007-09-14 21:49:09 UTC (rev 2422) @@ -19,7 +19,9 @@ #list all source files here ADD_EXECUTABLE(FeatureMatching FeatureMatching.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) +ADD_EXECUTABLE(gabor_feature_extractor FeatureExtractor.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) #need to link to some other libraries ? just add them here #TARGET_LINK_LIBRARIES(FeatureMatching highgui cv cxcore png jpeg) TARGET_LINK_LIBRARIES(FeatureMatching vigraimpex png jpeg tiff) +TARGET_LINK_LIBRARIES(gabor_feature_extractor vigraimpex png jpeg tiff) Added: gsoc07_featuredetection/FeatureExtractor.cpp =================================================================== --- gsoc07_featuredetection/FeatureExtractor.cpp (rev 0) +++ gsoc07_featuredetection/FeatureExtractor.cpp 2007-09-14 21:49:09 UTC (rev 2422) @@ -0,0 +1,166 @@ +/*************************************************************************** + * Copyright (C) 2007 by Zoran Mesec * + * zor...@gm... * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +//#define USE_OPENCV +//#define USE_QT +#define USE_VIGRA + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <iostream> +#include <fstream> +#include <stdlib.h> +#include <ctime> + +#include <string> +#include "APImage.h" +#include "HessianDetector.h" +#include "Descriptor.h" +#include "FeatureMatcher.h" + +using namespace std; + +void usage() +{ + cout << "FeatureMatching: run feature detection and extraction" << endl + << endl + << "Usage: FeatureMatching [options] image1.jpg" << endl + << "Options:" << endl + + << " -x generate xml suitable for Autopano-SIFT feature matcher" << endl + << " -o file generate XML file with interest points and descriptors(image1.jpg.xml, image2.jpg.xml)" << endl + << " -n num extract num interest points an descriptors" << endl + << " -v verbose output" << endl + //<< " TODO: replace with threshold, default 1000" << endl + << "Arguments:" << endl + << " image1.jpg first image to be analyzed." << endl + << endl; +} + +int main(int argc, char *argv[]) +{ + if(argc==1) { + usage(); + return 0; + } + const char * optstring = ":h:n:o:xv"; + char c; + clock_t start,finish; + double time; + + bool verbose = false; + string input1; + bool generateXML=false; + string output; + + int nrPoints = 4000; + + // parse arguments + while ((c = getopt (argc, argv, optstring)) != -1) + { + switch(c) { + case 'v': + verbose = true; + break; + case 'x': + generateXML=true; + break; + case 'o': + output = optarg; + break; + case 'n': + nrPoints = atoi(optarg); + break; + case 'h': + usage(); + return 0; + break; + default: + usage(); + return 0; + } + } + + if (optind+1 != argc) { + usage(); + return 1; + } + input1=argv[optind]; + +/*for (index = optind; index < argc; index++) { + printf ("Non-option argument %s\n", argv[index]); + } + return 0;*/ + + if (verbose) cerr << "Number of detected points:" << nrPoints<<endl; + + APImage im1(input1); + if(!im1.open()) { + cerr<< "Error! Image can not be opened"<<"\n"; + return 0; + } + + //need to integrate the image before the detection process(only if using box filter approximation) + im1.integrate(); + + if (verbose) cerr << "Starting detector..."<<endl; + start = clock(); + + HessianDetector hd1(&im1,nrPoints, HD_BOX_FILTERS,1); + if(!hd1.detect()) { + cerr << "Detection of points failed!"; + return 1; + } + //print points and display image with the detected points(debugging only) + /*hd1.printPoints(); + return 0;*/ + + finish = clock(); + + time = (double(finish)-double(start))/CLOCKS_PER_SEC; + if (verbose) cerr << "...detection of points finished. Measured time:"<<time<<endl; + + + Descriptor d1(&im1,&hd1); + d1.setPoints(hd1.getPoints()); + //d.orientate(); + d1.createDescriptors(); + if (output.size() > 0) { + ofstream outFile (output.c_str()); + if (outFile.is_open()) { + if(generateXML) + d1.printDescriptorsXML(outFile); + else + d1.printDescriptors(outFile); + } else { + cerr << "Could not open output file " << output << endl; + return 1; + } + } else { + if(generateXML) + d1.printDescriptorsXML(cout); + else + d1.printDescriptors(cout); + } + return 0; +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-09-14 21:53:14
|
Revision: 2423 http://hugin.svn.sourceforge.net/hugin/?rev=2423&view=rev Author: dangelo Date: 2007-09-14 14:53:11 -0700 (Fri, 14 Sep 2007) Log Message: ----------- output panotools script Modified Paths: -------------- gsoc07_featuredetection/APImage.cpp gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/FeatureMatching.cpp gsoc07_featuredetection/HessianDetector.cpp Modified: gsoc07_featuredetection/APImage.cpp =================================================================== --- gsoc07_featuredetection/APImage.cpp 2007-09-14 21:49:09 UTC (rev 2422) +++ gsoc07_featuredetection/APImage.cpp 2007-09-14 21:53:11 UTC (rev 2423) @@ -42,54 +42,19 @@ if(info.isGrayscale()) { // create a gray scale image of appropriate size - vigra::BImage in(info.width(), info.height()); this->imgBW=new BImage(info.width(), info.height()); // import the image just read importImage(info, destImage(*this->imgBW)); } else { + BRGBImage rgbImage(info.width(), info.height()); + importImage(info, destImage(rgbImage)); - BRGBImage in(info.width(), info.height()); - - //TODO: this does not work. How to make a conversion from RGB to BW image in vigra??? + // convert to grayscale this->imgBW=new BImage(info.width(), info.height()); - - importImage(info, destImage(in)); - - // create image iterator that points to upper left corner - // of source image - vigra::BRGBImage::Iterator sy = in.upperLeft(); - - // create image iterator that points past the lower right corner of - // source image (similarly to the past-the-end iterator in the STL) - vigra::BRGBImage::Iterator send = in.lowerRight(); - - // create image iterator that points to upper left corner - // of destination image - vigra::BImage::Iterator dy = (*this->imgBW).upperLeft(); - - // iterate down the first column of the images - for(; sy.y != send.y; ++sy.y, ++dy.y) - { - // create image iterator that points to the first - // pixel of the current row of the source image - vigra::BRGBImage::Iterator sx = sy; - - // create image iterator that points to the first - // pixel of the current row of the destination image - vigra::BImage::Iterator dx = dy; - - // iterate across current row - for(; sx.x != send.x; ++sx.x, ++dx.x) - { - RGBValue<int,0u,1u,2u> pixel = *sx; - // calculate grayscale value - // Y = 0.3*R + 0.59*G + 0.11*B - *dx = vigra::round(0.3*pixel.red() + 0.59*pixel.green() + 0.11*pixel.blue()); - } - } - //exportAPImage(srcAPImageRange(*this->imgBW), vigra::APImageExportInfo("ttt.jpg")); + RGBToGrayAccessor<RGBValue<UInt8> > rgb2g; + copyImage(srcImageRange(rgbImage, rgb2g), destImage(*(this->imgBW))); } return true; } Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-09-14 21:49:09 UTC (rev 2422) +++ gsoc07_featuredetection/Descriptor.cpp 2007-09-14 21:53:11 UTC (rev 2423) @@ -705,11 +705,7 @@ } } -bool Descriptor::generateAutopanoXML(string name) { - cout << "Generating XML file: "<<name<<endl; - ofstream xmlFile (name.c_str()); - if (xmlFile.is_open()) - { +void Descriptor::printDescriptorsXML(std::ostream &xmlFile) { xmlFile << "<?xml version=\"1.0\" encoding=\"utf-8\"?>"<< endl; xmlFile << "<KeypointXMLList xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; xmlFile << " <XDim>"<< this->image->getHeight() <<"</XDim>"<< endl; @@ -745,9 +741,4 @@ xmlFile << " </Arr>"<< endl; xmlFile << "</KeypointXMLList>"<< endl; - - xmlFile.close(); - return true; - } - else return false; } Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-09-14 21:49:09 UTC (rev 2422) +++ gsoc07_featuredetection/Descriptor.h 2007-09-14 21:53:11 UTC (rev 2423) @@ -40,7 +40,7 @@ void createDescriptors(); vector<vector<double> >* getDescriptors(); void printDescriptors(std::ostream & o); - bool generateAutopanoXML(string name); + void printDescriptorsXML(std::ostream & o); vector<vector<int> >* interestPoints; Modified: gsoc07_featuredetection/FeatureMatching.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatching.cpp 2007-09-14 21:49:09 UTC (rev 2422) +++ gsoc07_featuredetection/FeatureMatching.cpp 2007-09-14 21:53:11 UTC (rev 2423) @@ -142,7 +142,13 @@ d1.setPoints(hd1.getPoints()); //d.orientate(); d1.createDescriptors(); - if(generateXML) d1.generateAutopanoXML(input1.append(".xml")); + if(generateXML) { + std::ofstream outFile (input1.append(".xml").c_str()); + if (outFile.is_open()) { + d1.printDescriptorsXML(outFile); + } + } + /*d1.printDescriptors(cout); return 0;*/ @@ -158,7 +164,12 @@ d2.setPoints(hd2.getPoints()); //d.orientate(); d2.createDescriptors(); - if(generateXML) d2.generateAutopanoXML(input2.append(".xml")); + if(generateXML) { + ofstream outFile (input2.append(".xml").c_str()); + if (outFile.is_open()) { + d1.printDescriptorsXML(outFile); + } + } cout << "Matching..."<<endl; @@ -175,15 +186,21 @@ cout << "...matching ended." << endl; int size = cps.size(); - cout << "Nr of control points:"<< size <<endl; - cout << "Control points:"<<endl; - cout << "(x1\ty1\t:\tx2\ty2)"<<endl; + //cout << "Nr of control points:"<< size <<endl; + //cout << "Control points:"<<endl; + //cout << "(x1\ty1\t:\tx2\ty2)"<<endl; vector<vector<int> >::iterator iter1 =cps.begin(); + cout << "p w3000 h1500 f0 v360 o\"TIFF_m\""<< endl << endl + << "i n\"" << input1 << "\" f0 v50 a0" << endl + << "i n\"" << input2 << "\" f0 v50 a=0" << endl << endl; + while( iter1 != cps.end()) { vector<int> current = *iter1; - cout << current[0] << "\t" << current[1] << "\t" << ":" << "\t" << current[2] << "\t" << current[3] << endl ; + //cout << current[0] << "\t" << current[1] << "\t" << ":" << "\t" << current[2] << "\t" << current[3] << endl ; + // output in a pto file compatible format + cout << "c n0 N1 x" << current[0] << " y" << current[1] << " X" << current[2] << " Y" << current[3] << " t0" << endl ; im1.drawCircle(current[2],current[3],10); im2.drawCircle(current[0],current[1],10); iter1++; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-09-14 21:49:09 UTC (rev 2422) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-09-14 21:53:11 UTC (rev 2423) @@ -60,6 +60,7 @@ } else if(this->convolutionType==HD_SLIDING_WINDOW) { return this->_slidingWDetect(); } + return false; } bool HessianDetector::_slidingWDetect() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2008-01-26 18:59:31
|
Revision: 2699 http://hugin.svn.sourceforge.net/hugin/?rev=2699&view=rev Author: stereo_sl Date: 2008-01-26 10:59:27 -0800 (Sat, 26 Jan 2008) Log Message: ----------- * implemented ShapeContext descriptors * fixed mess with x and y axis * code unstable - needs debug Modified Paths: -------------- gsoc07_featuredetection/APImage.cpp gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h Modified: gsoc07_featuredetection/APImage.cpp =================================================================== --- gsoc07_featuredetection/APImage.cpp 2008-01-25 12:29:08 UTC (rev 2698) +++ gsoc07_featuredetection/APImage.cpp 2008-01-26 18:59:27 UTC (rev 2699) @@ -120,7 +120,7 @@ } int APImage::getPixel(int x,int y) { #ifdef USE_VIGRA - return (*this->imgBW)(y,x); + return (*this->imgBW)(x,y); #endif #ifdef USE_OPENCV CvScalar s=cvGet2D(imgBW,x,y); @@ -168,14 +168,16 @@ void APImage::drawCircle(int x,int y, int radius) { //cout << "Circle:" << x << "," << y << ",radius:"<<radius<<"\n"; #ifdef USE_VIGRA - (*this->imgBW)(y,x) = 255; - (*this->imgBW)(y+1,x+1) = 255; - (*this->imgBW)(y-1,x-1) = 255; - (*this->imgBW)(y-1,x) = 255; - (*this->imgBW)(y,x-1) = 255; + + (*this->imgBW)(x,y) = 255; + (*this->imgBW)(x+1,y+1) = 255; + (*this->imgBW)(x-1,y-1) = 255; + (*this->imgBW)(x-1,y+1) = 255; + (*this->imgBW)(x+1,y-1) = 255; + #endif + //cout << "EOF CIRCLE DRAWING" <<endl; - #ifdef USE_OPENCV cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); cvCircle(this->img, cvPoint(x,y), 0, cvScalar(0,255,0), 1); @@ -206,10 +208,10 @@ cout << "Width:"<< this->getWidthBW() <<"\n"; this->integral.clear(); - this->integral.resize(this->getHeightBW()); - for(int i=0;i<this->getHeightBW();i++) { - this->integral[i].resize(this->getWidthBW()); - for(int j=0; j<this->getWidthBW();j++) { + this->integral.resize(this->getWidthBW()); + for(int i=0;i<this->getWidthBW();i++) { + this->integral[i].resize(this->getHeightBW()); + for(int j=0; j<this->getHeightBW();j++) { //cout << i << ","<< j<<"\n"; this->integral[i][j]=this->_getValue4Integral(i,j-1)+this->_getValue4Integral(i-1,j)+this->getPixel(i,j)-this->_getValue4Integral(i-1,j-1); } @@ -223,15 +225,15 @@ int APImage::getIntegralPixel(int x,int y) { return this->integral[x][y]; } -int APImage::getRegionSum(int x1, int y1, int x2, int y2) { +int APImage::getRegionSum(int y1, int x1, int y2, int x2) { if(x1<=0) x1=1; if(y1<=0) y1=1; if(x2<=0) x2=1; if(y2<=0) y2=1; - if(x1>=this->getHeightBW()) x1=this->getHeightBW()-1; - if(x2>=this->getHeightBW()) x2=this->getHeightBW()-1; - if(y1>=this->getWidthBW()) y1=this->getWidthBW()-1; - if(y2>=this->getWidthBW()) y2=this->getWidthBW()-1; + if(x1>=this->getWidthBW()) x1=this->getWidthBW()-1; + if(x2>=this->getWidthBW()) x2=this->getWidthBW()-1; + if(y1>=this->getHeightBW()) y1=this->getHeightBW()-1; + if(y2>=this->getHeightBW()) y2=this->getHeightBW()-1; return this->integral[x2][y2]+this->integral[x1-1][y1-1]-this->integral[x1-1][y2]-this->integral[x2][y1-1]; } string APImage::getPath() { Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2008-01-25 12:29:08 UTC (rev 2698) +++ gsoc07_featuredetection/Descriptor.cpp 2008-01-26 18:59:27 UTC (rev 2699) @@ -584,99 +584,117 @@ } } +void Descriptor::_RegionResponse(int x,int y, double maxima, double* descriptor) { + int add; + int sum1; + int sum2; + int sum3; + int sum4; + int cnt=0; + + /*for(int i=2; i<=32;i*=2) { + add=round(maxima*i); + sum1=this->image->getRegionSum(x-add,y,x,y+add); + sum2=-1*this->image->getRegionSum(x,y,x+add,y+add); + sum3=this->image->getRegionSum(x,y-add,x+add,y); + sum4=-1*this->image->getRegionSum(x-add,y-add,x,y); + descriptor[cnt+0]+=(sum1+sum3)/pow((double)i,4.0); + descriptor[cnt+1]+=(sum2+sum4)/pow(i,4); + descriptor[cnt+2]+=(sum1+sum2+sum3+sum4)/pow(i,4); + descriptor[cnt+3]+=abs(sum1+sum2+sum3+sum4)/pow(i,4); + cnt+=5; + }*/ +} + +void Descriptor::_ShapeContext(int x,int y, double maxima, double* descriptor) { + + + /*for(int i=2; i<=32;i*=2) { + add=round(maxima*i); + sum1=this->image->getRegionSum(x-add,y,x,y+add); + sum2=-1*this->image->getRegionSum(x,y,x+add,y+add); + sum3=this->image->getRegionSum(x,y-add,x+add,y); + sum4=-1*this->image->getRegionSum(x-add,y-add,x,y); + descriptor[cnt+0]+=(sum1+sum3)/pow((double)i,4.0); + descriptor[cnt+1]+=(sum2+sum4)/pow(i,4); + descriptor[cnt+2]+=(sum1+sum2+sum3+sum4)/pow(i,4); + descriptor[cnt+3]+=abs(sum1+sum2+sum3+sum4)/pow(i,4); + cnt+=5; + }*/ +} + void Descriptor::createDescriptors() { int regionSize; - + int i=0; + this->interestPoints->resize(this->interestPoints->size()); + cout << this->interestPoints->size()<<endl; vector<vector<int> >::iterator iter1 = this->interestPoints->begin(); - while( iter1 != this->interestPoints->end()) { //loop over every interest point + while( iter1 != this->interestPoints->end() ) { //loop over every interest point vector<int > interestPoint=*iter1; - + i++; vector<double> descriptor; - for(int i=0;i<DESCRIPTOR_SIZE;i++) { - descriptor.push_back(0); + for(int i=0;i<DESCRIPTOR_SIZE;i++) { //initialize array + descriptor.push_back(0); } - regionSize=round(8*this->_getMaxima(interestPoint[0], interestPoint[1])); + regionSize=round(20*this->_getMaxima(interestPoint[0], interestPoint[1])); - int xStart=(interestPoint[0]-regionSize); - int xEnd=(interestPoint[0]); - int yStart=(interestPoint[1]-regionSize); - int yEnd=(interestPoint[1]); + int xStart=(interestPoint[1]-regionSize); + int xEnd=(interestPoint[1] +regionSize); + int yStart=(interestPoint[0]-regionSize); + int yEnd=(interestPoint[0]+regionSize); - //first subregion - for(int i=xStart;i<=xEnd;i+=2) { - for(int j=yStart; j<=yEnd;j+=2) { - //double dist=_euclidianDistance(interestPoint[0],interestPoint[1], i,j); - //if(dist<=(regionSize+0.5)) { //if point is in the circle - this->_GaborResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[0]); - //this->_RegionResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[0]); - //} - } - //cout << "\n"; - } +/* + double result; + result = atan (gy/gx) * 180 / PI; + result+=90; - xStart=(interestPoint[0]-regionSize); - xEnd=(interestPoint[0]); - yStart=(interestPoint[1]); - yEnd=(interestPoint[1]+regionSize); - for(int i=xStart;i<=xEnd;i+=2) { - for(int j=yStart; j<=yEnd;j+=2) { - //double dist=_euclidianDistance(interestPoint[0],interestPoint[1], i,j); - //if(dist<=(regionSize+0.5)) { //if point is in the circle - this->_GaborResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[24]); - //this->_RegionResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[20]); - //} - } - //cout << "\n"; - } + if(result<22.5 && result>=157.5) cp->direction=0; + else if(result>=22.5 && result<67.5) cp->direction=1; + else if(result>=67.5 && result<112.5) cp->direction=2; + else if(result>=112.5 && result<157.5) cp->direction=3; - xStart=(interestPoint[0]); - xEnd=(interestPoint[0]+regionSize); - yStart=(interestPoint[1]-regionSize); - yEnd=(interestPoint[1]); - for(int i=xStart;i<=xEnd;i+=2) { - for(int j=yStart; j<=yEnd;j+=2) { - //double dist=_euclidianDistance(interestPoint[0],interestPoint[1], i,j); - //if(dist<=(regionSize+0.5)) { //if point is in the circle - this->_GaborResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[48]); - //this->_RegionResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[40]); - //} - } - //cout << "\n"; - } +*/ + // empty edgel list + std::vector<vigra::Edgel> edgels; - xStart=(interestPoint[0]); - xEnd=(interestPoint[0]+regionSize); - yStart=(interestPoint[1]); - yEnd=(interestPoint[1]+regionSize); - for(int i=xStart;i<=xEnd;i++) { - for(int j=yStart; j<=yEnd;j++) { - //double dist=_euclidianDistance(interestPoint[0],interestPoint[1], i,j); - //if(dist<=(regionSize+0.5)) { //if point is in the circle - this->_GaborResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[72]); - //this->_RegionResponse(i,j, this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor[60]); - //} - } - //cout << "\n"; - } + // find edgels at scale of the interest point + vigra::cannyEdgelList(srcIterRange( this->image->imgBW->upperLeft() + vigra::Diff2D(xStart, yStart), + this->image->imgBW->upperLeft() + vigra::Diff2D(xEnd, yEnd)), + edgels, this->_getMaxima(interestPoint[0], interestPoint[1])); - //find the max element of the descriptor - /*int max=descriptor[0]; - int maxId=0; - for(int i=1;i<8;i++) { - if(descriptor[i]>max) { - max=descriptor[i]; - maxId=i; - } - } - //invariance to rotation - //shift descriptor so that max element becomes first - for(int i=0;i<maxId;i++) { - int tmp=descriptor[0]; - descriptor.erase(descriptor.begin()); - descriptor.push_back(tmp); - }*/ + vector<vigra::Edgel>::iterator iter2 = edgels.begin(); + while( iter2 != edgels.end()) { //loop over every canny pixel + vigra::Edgel edgePoint=*iter2; + //cout << edgePoint.x << ","<<edgePoint.y << "; orientation:"<<edgePoint.orientation<<",strength:"<<edgePoint.strength<<endl; + edgePoint.x+=xStart; + edgePoint.y+=yStart; + + int sector; + if(edgePoint.orientation<0) edgePoint.orientation+=2*PI; + + int orientSector; + + //orientation is quantized into 4 bins + if(edgePoint.orientation>=0 && edgePoint.orientation<(PI/2)) orientSector=0; + else if(edgePoint.orientation>=(PI/2) && edgePoint.orientation<PI) orientSector=1; + else if(edgePoint.orientation>=PI && edgePoint.orientation<(3*PI/2)) orientSector=2; + else if(edgePoint.orientation>=(3*PI/2)) orientSector=3; + + //location is quantized into 9 bins + if(edgePoint.x<=interestPoint[0] && edgePoint.y>=interestPoint[1]) sector=1; + else if(edgePoint.x<=interestPoint[0] && edgePoint.y<=interestPoint[1]) sector=2; + else if(edgePoint.x>=interestPoint[0] && edgePoint.y<=interestPoint[1]) sector=3; + else if(edgePoint.x>=interestPoint[0] && edgePoint.y>=interestPoint[1]) sector=0; + + double distance=_euclidianDistance(interestPoint[1],interestPoint[0],edgePoint.x,edgePoint.y); + if(distance<=13) descriptor[orientSector*9 + 8]+=edgePoint.strength; + else if(distance>13 && distance<=23) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; + else if(distance>23) descriptor[orientSector*9 + sector*2+1]+=edgePoint.strength; + iter2++; + } + //cout << "adding d:"<< i<<endl; this->descriptors.push_back(descriptor); iter1++; } Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2008-01-25 12:29:08 UTC (rev 2698) +++ gsoc07_featuredetection/Descriptor.h 2008-01-26 18:59:27 UTC (rev 2699) @@ -25,7 +25,7 @@ #include "HessianDetector.h" #define NR_ANGLE_BINS 8 -#define DESCRIPTOR_SIZE 96 +#define DESCRIPTOR_SIZE 36 class Descriptor { @@ -52,6 +52,8 @@ double _euclidianDistance(int x1, int y1, int x2, int y2); //double _initDescriptor(double* desciptor); void _GaborResponse(int x,int y,double maxima,double* descriptor); + void _RegionResponse(int x,int y,double maxima,double* descriptor); + void _ShapeContext(int x,int y,double maxima,double* descriptor); vector<vector<int> >* maximas; vector<vector<double> > descriptors; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2008-01-25 12:29:08 UTC (rev 2698) +++ gsoc07_featuredetection/HessianDetector.cpp 2008-01-26 18:59:27 UTC (rev 2699) @@ -40,14 +40,14 @@ this->orderedList.reserve(sizeof(point)*nrPoints); //initialize the vectors - determinants.resize(this->image->getHeightBW()); - maximas.resize(this->image->getHeightBW()); + determinants.resize(this->image->getWidthBW()); + maximas.resize(this->image->getWidthBW()); const int iMax=std::numeric_limits<int>::max(); - for(int i=0;i<this->image->getHeightBW();i++) { - maximas[i].resize(this->image->getWidthBW()); - determinants[i].resize(this->image->getWidthBW()); - for(int j=0; j<this->image->getWidthBW();j++) { + for(int i=0;i<this->image->getWidthBW();i++) { + maximas[i].resize(this->image->getHeightBW()); + determinants[i].resize(this->image->getHeightBW()); + for(int j=0; j<this->image->getHeightBW();j++) { maximas[i][j] =0 ; determinants[i][j]=iMax; } @@ -236,29 +236,28 @@ const int iMax=std::numeric_limits<int>::max(); - //TODO: - //leave out pixels close to the edge; number of left-out pixels - //vary according to image size - int offsetX=height*0.2; - int offsetY=width*0.2; + int offsetX=width*0.05; + int offsetY=height*0.05; int xStart=offsetX; int yStart=offsetY; - int xEnd=height-offsetX; - int yEnd=width-offsetY; + int xEnd=width-offsetX; + int yEnd=height-offsetY; - for(int i=xStart;i<xEnd;i++) { - for(int j=yStart; j<yEnd;j++) { - _calculateMaxDet(i,j); //calculate it + for(int j=yStart;j<yEnd;j++) { + for(int i=xStart; i<xEnd;i++) { + //_calculateMaxDet(x_coord,y_coord) + _calculateMaxDet(i,j); //calculate determinant + } } vector<vector<int> >::iterator it; it = orderedList.begin(); - - for(int i=xStart;i<xEnd;i++) { - for(int j=yStart; j<yEnd;j++) { + //point (x,y) => (j,i) + for(int j=yStart;j<yEnd;j++) { + for(int i=xStart; i<xEnd;i++) { /**Non-maxima suppression *if any determinant in the area around the pixel is *greater than the pixel, suppress the current pixel. @@ -296,7 +295,7 @@ return true; } -void HessianDetector::_calculateMaxDet(int i, int j) { +void HessianDetector::_calculateMaxDet(int x, int y) { /** * Each octave has 4 kernel sizes. */ @@ -309,42 +308,42 @@ double interp2; //first octave - interp1=(this->_convolutePixel(&i,&j,&octaves[0][0])+this->_convolutePixel(&i,&j,&octaves[0][1]))/2; - interp2=(this->_convolutePixel(&i,&j,&octaves[0][2])+this->_convolutePixel(&i,&j,&octaves[0][3]))/2; + interp1=(this->_convolutePixel(&x,&y,&octaves[0][0])+this->_convolutePixel(&x,&y,&octaves[0][1]))/2; + interp2=(this->_convolutePixel(&x,&y,&octaves[0][2])+this->_convolutePixel(&x,&y,&octaves[0][3]))/2; if(interp1>interp2) { - this->determinants[i][j]=interp1; - this->maximas[i][j]=(((octaves[0][0]+octaves[0][1])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; + this->determinants[x][y]=interp1; + this->maximas[x][y]=(((octaves[0][0]+octaves[0][1])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; } else { - this->determinants[i][j]=interp2; - this->maximas[i][j]=(((octaves[0][2]+octaves[0][3])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; //scale of interpolation + this->determinants[x][y]=interp2; + this->maximas[x][y]=(((octaves[0][2]+octaves[0][3])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; //scale of interpolation } //second octave - if(this->nrOctaves>1 && i%2==0 && j%2==0) { //points are sampled - interp1=(this->_convolutePixel(&i,&j,&octaves[1][0])+this->_convolutePixel(&i,&j,&octaves[1][1]))/2; - interp2=(this->_convolutePixel(&i,&j,&octaves[1][2])+this->_convolutePixel(&i,&j,&octaves[1][3]))/2; - if(interp1>this->determinants[i][j] || interp2>this->determinants[i][j] ) { + if(this->nrOctaves>1 && x%2==0 && y%2==0) { //points are sampled + interp1=(this->_convolutePixel(&x,&y,&octaves[1][0])+this->_convolutePixel(&x,&y,&octaves[1][1]))/2; + interp2=(this->_convolutePixel(&x,&y,&octaves[1][2])+this->_convolutePixel(&x,&y,&octaves[1][3]))/2; + if(interp1>this->determinants[x][y] || interp2>this->determinants[x][y] ) { if(interp1>interp2) { - this->determinants[i][j]=interp1; - this->maximas[i][j]=(((octaves[1][0]+octaves[1][1])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; + this->determinants[x][y]=interp1; + this->maximas[x][y]=(((octaves[1][0]+octaves[1][1])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; } else { - this->determinants[i][j]=interp2; - this->maximas[i][j]=(((octaves[1][2]+octaves[1][3])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; //scale of interpolation + this->determinants[x][y]=interp2; + this->maximas[x][y]=(((octaves[1][2]+octaves[1][3])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; //scale of interpolation } } } //third octave - if(this->nrOctaves==HD_MAX_OCTAVES && i%4==0 && j%4==0) { //points are sampled - interp1=(this->_convolutePixel(&i,&j,&octaves[2][0])+this->_convolutePixel(&i,&j,&octaves[2][1]))/2; - interp2=(this->_convolutePixel(&i,&j,&octaves[2][2])+this->_convolutePixel(&i,&j,&octaves[2][3]))/2; - if(interp1>this->determinants[i][j] || interp2>this->determinants[i][j] ) { + if(this->nrOctaves==HD_MAX_OCTAVES && x%4==0 && y%4==0) { //points are sampled + interp1=(this->_convolutePixel(&x,&y,&octaves[2][0])+this->_convolutePixel(&x,&y,&octaves[2][1]))/2; + interp2=(this->_convolutePixel(&x,&y,&octaves[2][2])+this->_convolutePixel(&x,&y,&octaves[2][3]))/2; + if(interp1>this->determinants[x][y] || interp2>this->determinants[x][y] ) { if(interp1>interp2) { - this->determinants[i][j]=interp1; - this->maximas[i][j]=(((octaves[2][0]+octaves[2][1])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; + this->determinants[x][y]=interp1; + this->maximas[x][y]=(((octaves[2][0]+octaves[2][1])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; } else { - this->determinants[i][j]=interp2; - this->maximas[i][j]=(((octaves[2][2]+octaves[2][3])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; //scale of interpolation + this->determinants[x][y]=interp2; + this->maximas[x][y]=(((octaves[2][2]+octaves[2][3])/2)*HD_INITIAL_SCALE)/HD_INIT_KERNEL_SIZE; //scale of interpolation } } } @@ -354,200 +353,201 @@ return *pixelSumXX*(*pixelSumYY)-pow((0.9*(*pixelSumXY)),2); } -int HessianDetector::_convolutePixel(int* i, int* j, int* kernelSize) { +int HessianDetector::_convolutePixel(int* x, int* y, int* kernelSize) { //for box filters only + int pixelSumXX=0; int pixelSumYY=0; - int pixelSumXX=0; int pixelSumXY=0; int det; switch(*kernelSize) { case 9: //9x9 kernel - pixelSumXX=this->image->getRegionSum(*i-4,*j-2,*i-2,*j+2); - pixelSumXX+=this->image->getRegionSum(*i+2,*j-2,*i+4,*j+2); - pixelSumXX+=-2*this->image->getRegionSum(*i-1,*j-2,*i+1,*j+2); + //getRegionSum(y1,x1,y2,x2) + pixelSumYY=this->image->getRegionSum(*y-4,*x-2,*y-2,*x+2); + pixelSumYY+=this->image->getRegionSum(*y+2,*x-2,*y+4,*x+2); + pixelSumYY+=-2*this->image->getRegionSum(*y-1,*x-2,*y+1,*x+2); - pixelSumXY=-1*this->image->getRegionSum(*i-3,*j+1,*i-1,*j+3); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-3,*i+3,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-3,*j-3,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+3,*j+3); + pixelSumXY=-1*this->image->getRegionSum(*y-3,*x+1,*y-1,*x+3); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-3,*y+3,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-3,*x-3,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+3,*x+3); - pixelSumYY=this->image->getRegionSum(*i-2,*j-4,*i+2,*j-2); - pixelSumYY+=this->image->getRegionSum(*i-2,*j+2,*i+2,*j+4); - pixelSumYY+=-2*this->image->getRegionSum(*i-2,*j-1,*i+2,*j+1); + pixelSumXX=this->image->getRegionSum(*y-2,*x-4,*y+2,*x-2); + pixelSumXX+=this->image->getRegionSum(*y-2,*x+2,*y+2,*x+4); + pixelSumXX+=-2*this->image->getRegionSum(*y-2,*x-1,*y+2,*x+1); //determinant of the Hessian Matrix det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); break; case 11: //11x11 kernel - pixelSumXX=this->image->getRegionSum(*i-5,*j-3,*i-2,*j+3); - pixelSumXX+=this->image->getRegionSum(*i+2,*j-3,*i+5,*j+3); - pixelSumXX+=-2*this->image->getRegionSum(*i-1,*j-3,*i+1,*j+3); + pixelSumYY=this->image->getRegionSum(*y-5,*x-3,*y-2,*x+3); + pixelSumYY+=this->image->getRegionSum(*y+2,*x-3,*y+5,*x+3); + pixelSumYY+=-2*this->image->getRegionSum(*y-1,*x-3,*y+1,*x+3); - pixelSumXY=-1*this->image->getRegionSum(*i-4,*j+1,*i-1,*j+4); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-4,*i+4,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-4,*j-4,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+4,*j+4); + pixelSumXY=-1*this->image->getRegionSum(*y-4,*x+1,*y-1,*x+4); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-4,*y+4,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-4,*x-4,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+4,*x+4); - pixelSumYY=this->image->getRegionSum(*i-3,*j-5,*i+3,*j-2); - pixelSumYY+=this->image->getRegionSum(*i-3,*j+2,*i+3,*j+5); - pixelSumYY+=-2*this->image->getRegionSum(*i-3,*j-1,*i+3,*j+1); + pixelSumXX=this->image->getRegionSum(*y-3,*x-5,*y+3,*x-2); + pixelSumXX+=this->image->getRegionSum(*y-3,*x+2,*y+3,*x+5); + pixelSumXX+=-2*this->image->getRegionSum(*y-3,*x-1,*y+3,*x+1); //determinant of the Hessian Matrix det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/2.232; break; case 15: //15x15 kernel - pixelSumXX=this->image->getRegionSum(*i-7,*j-4,*i-3,*j+4); - pixelSumXX+=this->image->getRegionSum(*i+3,*j-4,*i+7,*j+4); - pixelSumXX+=-2*this->image->getRegionSum(*i-2,*j-4,*i+2,*j+4); + pixelSumYY=this->image->getRegionSum(*y-7,*x-4,*y-3,*x+4); + pixelSumYY+=this->image->getRegionSum(*y+3,*x-4,*y+7,*x+4); + pixelSumYY+=-2*this->image->getRegionSum(*y-2,*x-4,*y+2,*x+4); - pixelSumXY=-1*this->image->getRegionSum(*i-5,*j+1,*i-1,*j+5); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-5,*i+5,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-5,*j-5,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+5,*j+5); + pixelSumXY=-1*this->image->getRegionSum(*y-5,*x+1,*y-1,*x+5); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-5,*y+5,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-5,*x-5,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+5,*x+5); - pixelSumYY=this->image->getRegionSum(*i-4,*j-7,*i+4,*j-3); - pixelSumYY+=this->image->getRegionSum(*i-4,*j+3,*i+4,*j+7); - pixelSumYY+=-2*this->image->getRegionSum(*i-4,*j-2,*i+4,*j+2); + pixelSumXX=this->image->getRegionSum(*y-4,*x-7,*y+4,*x-3); + pixelSumXX+=this->image->getRegionSum(*y-4,*x+3,*y+4,*x+7); + pixelSumXX+=-2*this->image->getRegionSum(*y-4,*x-2,*y+4,*x+2); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/7.72; break; case 17: //17x17 kernel - pixelSumXX=this->image->getRegionSum(*i-8,*j-4,*i-3,*j+4); - pixelSumXX+=this->image->getRegionSum(*i+3,*j-4,*i+8,*j+4); - pixelSumXX+=-2*this->image->getRegionSum(*i-2,*j-4,*i+2,*j+4); + pixelSumYY=this->image->getRegionSum(*y-8,*x-4,*y-3,*x+4); + pixelSumYY+=this->image->getRegionSum(*y+3,*x-4,*y+8,*x+4); + pixelSumYY+=-2*this->image->getRegionSum(*y-2,*x-4,*y+2,*x+4); - pixelSumXY=-1*this->image->getRegionSum(*i-6,*j+1,*i-1,*j+6); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-6,*i+6,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-6,*j-6,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+6,*j+6); + pixelSumXY=-1*this->image->getRegionSum(*y-6,*x+1,*y-1,*x+6); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-6,*y+6,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-6,*x-6,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+6,*x+6); - pixelSumYY=this->image->getRegionSum(*i-4,*j-8,*i+4,*j-3); - pixelSumYY+=this->image->getRegionSum(*i-4,*j+3,*i+4,*j+8); - pixelSumYY+=-2*this->image->getRegionSum(*i-4,*j-2,*i+4,*j+2); + pixelSumXX=this->image->getRegionSum(*y-4,*x-8,*y+4,*x-3); + pixelSumXX+=this->image->getRegionSum(*y-4,*x+3,*y+4,*x+8); + pixelSumXX+=-2*this->image->getRegionSum(*y-4,*x-2,*y+4,*x+2); //determinant of the Hessian Matrix det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/12.73; break; case 21: //21x21 kernel - pixelSumXX=this->image->getRegionSum(*i-10,*j-6,*i-4,*j+6); - pixelSumXX+=this->image->getRegionSum(*i+4,*j-6,*i+10,*j+6); - pixelSumXX+=-2*this->image->getRegionSum(*i-3,*j-6,*i+3,*j+6); + pixelSumYY=this->image->getRegionSum(*y-10,*x-6,*y-4,*x+6); + pixelSumYY+=this->image->getRegionSum(*y+4,*x-6,*y+10,*x+6); + pixelSumYY+=-2*this->image->getRegionSum(*y-3,*x-6,*y+3,*x+6); - pixelSumXY=-1*this->image->getRegionSum(*i-7,*j+1,*i-1,*j+7); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-7,*i+7,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-7,*j-7,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+7,*j+7); + pixelSumXY=-1*this->image->getRegionSum(*y-7,*x+1,*y-1,*x+7); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-7,*y+7,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-7,*x-7,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+7,*x+7); - pixelSumYY=this->image->getRegionSum(*i-6,*j-10,*i+6,*j-4); - pixelSumYY+=this->image->getRegionSum(*i-6,*j+4,*i+6,*j+10); - pixelSumYY+=-2*this->image->getRegionSum(*i-6,*j-3,*i+6,*j+3); + pixelSumXX=this->image->getRegionSum(*y-6,*x-10,*y+6,*x-4); + pixelSumXX+=this->image->getRegionSum(*y-6,*x+4,*y+6,*x+10); + pixelSumXX+=-2*this->image->getRegionSum(*y-6,*x-3,*y+6,*x+3); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/29.642; break; case 27: //27x27 kernel - pixelSumXX=this->image->getRegionSum(*i-13,*j-7,*i-5,*j+7); - pixelSumXX+=this->image->getRegionSum(*i+5,*j-7,*i+13,*j+7); - pixelSumXX+=-2*this->image->getRegionSum(*i-4,*j-7,*i+4,*j+7); + pixelSumYY=this->image->getRegionSum(*y-13,*x-7,*y-5,*x+7); + pixelSumYY+=this->image->getRegionSum(*y+5,*x-7,*y+13,*x+7); + pixelSumYY+=-2*this->image->getRegionSum(*y-4,*x-7,*y+4,*x+7); - pixelSumXY=-1*this->image->getRegionSum(*i-9,*j+1,*i-1,*j+9); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-9,*i+9,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-9,*j-9,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+9,*j+9); + pixelSumXY=-1*this->image->getRegionSum(*y-9,*x+1,*y-1,*x+9); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-9,*y+9,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-9,*x-9,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+9,*x+9); - pixelSumYY=this->image->getRegionSum(*i-7,*j-13,*i+7,*j-5); - pixelSumYY+=this->image->getRegionSum(*i-7,*j+5,*i+7,*j+13); - pixelSumYY+=-2*this->image->getRegionSum(*i-7,*j-4,*i+7,*j+4); + pixelSumXX=this->image->getRegionSum(*y-7,*x-13,*y+7,*x-5); + pixelSumXX+=this->image->getRegionSum(*y-7,*x+5,*y+7,*x+13); + pixelSumXX+=-2*this->image->getRegionSum(*y-7,*x-4,*y+7,*x+4); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/81; break; case 39: //39x39 kernel - pixelSumXX=this->image->getRegionSum(*i-19,*j-11,*i-7,*j+11); - pixelSumXX+=this->image->getRegionSum(*i+7,*j-11,*i+19,*j+11); - pixelSumXX+=-2*this->image->getRegionSum(*i-6,*j-11,*i+6,*j+11); + pixelSumYY=this->image->getRegionSum(*y-19,*x-11,*y-7,*x+11); + pixelSumYY+=this->image->getRegionSum(*y+7,*x-11,*y+19,*x+11); + pixelSumYY+=-2*this->image->getRegionSum(*y-6,*x-11,*y+6,*x+11); - pixelSumXY=-1*this->image->getRegionSum(*i-13,*j+1,*i-1,*j+13); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-13,*i+13,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-13,*j-13,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+13,*j+13); + pixelSumXY=-1*this->image->getRegionSum(*y-13,*x+1,*y-1,*x+13); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-13,*y+13,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-13,*x-13,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+13,*x+13); - pixelSumYY=this->image->getRegionSum(*i-11,*j-19,*i+11,*j-7); - pixelSumYY+=this->image->getRegionSum(*i-11,*j+7,*i+11,*j+19); - pixelSumYY+=-2*this->image->getRegionSum(*i-11,*j-6,*i+11,*j+6); + pixelSumXX=this->image->getRegionSum(*y-11,*x-19,*y+11,*x-7); + pixelSumXX+=this->image->getRegionSum(*y-11,*x+7,*y+11,*x+19); + pixelSumXX+=-2*this->image->getRegionSum(*y-11,*x-6,*y+11,*x+6); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/352.61; break; case 45: //45x45 kernel - pixelSumXX=this->image->getRegionSum(*i-22,*j-12,*i-8,*j+12); - pixelSumXX+=this->image->getRegionSum(*i+8,*j-12,*i+22,*j+12); - pixelSumXX+=-2*this->image->getRegionSum(*i-7,*j-12,*i+7,*j+12); + pixelSumYY=this->image->getRegionSum(*y-22,*x-12,*y-8,*x+12); + pixelSumYY+=this->image->getRegionSum(*y+8,*x-12,*y+22,*x+12); + pixelSumYY+=-2*this->image->getRegionSum(*y-7,*x-12,*y+7,*x+12); - pixelSumXY=-1*this->image->getRegionSum(*i-15,*j+1,*i-1,*j+15); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-15,*i+15,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-15,*j-15,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+15,*j+15); + pixelSumXY=-1*this->image->getRegionSum(*y-15,*x+1,*y-1,*x+15); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-15,*y+15,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-15,*x-15,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+15,*x+15); - pixelSumYY=this->image->getRegionSum(*i-12,*j-22,*i+12,*j-8); - pixelSumYY+=this->image->getRegionSum(*i-12,*j+8,*i+12,*j+22); - pixelSumYY+=-2*this->image->getRegionSum(*i-12,*j-7,*i+12,*j+7); + pixelSumXX=this->image->getRegionSum(*y-12,*x-22,*y+12,*x-8); + pixelSumXX+=this->image->getRegionSum(*y-12,*x+8,*y+12,*x+22); + pixelSumXX+=-2*this->image->getRegionSum(*y-12,*x-7,*y+12,*x+7); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/625; break; case 51: //51x51 kernel - pixelSumXX=this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); - pixelSumXX+=this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); - pixelSumXX+=-2*this->image->getRegionSum(*i-8,*j-14,*i+8,*j+14); + pixelSumYY=this->image->getRegionSum(*y-25,*x-14,*y-9,*x+14); + pixelSumYY+=this->image->getRegionSum(*y+9,*x-14,*y+25,*x+14); + pixelSumYY+=-2*this->image->getRegionSum(*y-8,*x-14,*y+8,*x+14); - pixelSumXY=-1*this->image->getRegionSum(*i-17,*j+1,*i-1,*j+17); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-17,*i+17,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + pixelSumXY=-1*this->image->getRegionSum(*y-17,*x+1,*y-1,*x+17); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-17,*y+17,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-17,*x-17,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+17,*x+17); - pixelSumYY=this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); - pixelSumYY+=this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); - pixelSumYY+=-2*this->image->getRegionSum(*i-14,*j-8,*i+14,*j+8); + pixelSumXX=this->image->getRegionSum(*y-14,*x-25,*y+14,*x-9); + pixelSumXX+=this->image->getRegionSum(*y-14,*x+9,*y+14,*x+25); + pixelSumXX+=-2*this->image->getRegionSum(*y-14,*x-8,*y+14,*x+8); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/1031.123; break; case 69: // TODO (zoran#1#): //69x69 kernel - pixelSumXX=this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); - pixelSumXX+=this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); - pixelSumXX+=-2*this->image->getRegionSum(*i-8,*j-14,*i+8,*j+14); + pixelSumYY=this->image->getRegionSum(*y-25,*x-14,*y-9,*x+14); + pixelSumYY+=this->image->getRegionSum(*y+9,*x-14,*y+25,*x+14); + pixelSumYY+=-2*this->image->getRegionSum(*y-8,*x-14,*y+8,*x+14); - pixelSumXY=-1*this->image->getRegionSum(*i-17,*j+1,*i-1,*j+17); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-17,*i+17,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + pixelSumXY=-1*this->image->getRegionSum(*y-17,*x+1,*y-1,*x+17); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-17,*y+17,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-17,*x-17,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+17,*x+17); - pixelSumYY=this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); - pixelSumYY+=this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); - pixelSumYY+=-2*this->image->getRegionSum(*i-14,*j-8,*i+14,*j+8); + pixelSumXX=this->image->getRegionSum(*y-14,*x-25,*y+14,*x-9); + pixelSumXX+=this->image->getRegionSum(*y-14,*x+9,*y+14,*x+25); + pixelSumXX+=-2*this->image->getRegionSum(*y-14,*x-8,*y+14,*x+8); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; break; case 93: // TODO (zoran#1#): //93x93 kernel - pixelSumXX=this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); - pixelSumXX+=this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); - pixelSumXX+=-2*this->image->getRegionSum(*i-8,*j-14,*i+8,*j+14); + pixelSumYY=this->image->getRegionSum(*y-25,*x-14,*y-9,*x+14); + pixelSumYY+=this->image->getRegionSum(*y+9,*x-14,*y+25,*x+14); + pixelSumYY+=-2*this->image->getRegionSum(*y-8,*x-14,*y+8,*x+14); - pixelSumXY=-1*this->image->getRegionSum(*i-17,*j+1,*i-1,*j+17); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-17,*i+17,*j-1); - pixelSumXY+=this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); - pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + pixelSumXY=-1*this->image->getRegionSum(*y-17,*x+1,*y-1,*x+17); + pixelSumXY+=-1*this->image->getRegionSum(*y+1,*x-17,*y+17,*x-1); + pixelSumXY+=this->image->getRegionSum(*y-17,*x-17,*y-1,*x-1); + pixelSumXY+=this->image->getRegionSum(*y+1,*x+1,*y+17,*x+17); - pixelSumYY=this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); - pixelSumYY+=this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); - pixelSumYY+=-2*this->image->getRegionSum(*i-14,*j-8,*i+14,*j+8); + pixelSumXX=this->image->getRegionSum(*y-14,*x-25,*y+14,*x-9); + pixelSumXX+=this->image->getRegionSum(*y-14,*x+9,*y+14,*x+25); + pixelSumXX+=-2*this->image->getRegionSum(*y-14,*x-8,*y+14,*x+8); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; break; @@ -603,7 +603,7 @@ while( iter1 != orderedList.end()) { vector<int > tmp2=*iter1; //cout << "("<<tmp2[0]<<","<<tmp2[1]<<","<<tmp2[2]<<")\n"; - this->image->drawCircle(tmp2[1],tmp2[0],maximas[tmp2[0]][tmp2[1]]*HD_INIT_KERNEL_SIZE); + this->image->drawCircle(tmp2[0],tmp2[1],maximas[tmp2[0]][tmp2[1]]*HD_INIT_KERNEL_SIZE); //c++; //this->image->drawCircle(tmp2[1],tmp2[0],1); iter1++; Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2008-01-25 12:29:08 UTC (rev 2698) +++ gsoc07_featuredetection/HessianDetector.h 2008-01-26 18:59:27 UTC (rev 2699) @@ -58,8 +58,18 @@ int nrPoints; int nrOctaves; CONVOLUTION_TYPE convolutionType; + + /** + * 0---> x + * | + * | + * v y + */ + //Point is represented as T(x,y) + //determinants[x][y] stands for determinant of point T(x,y) std::vector<vector<int> > determinants; //holds the values of the hessian determinant for each pixel std::vector<vector<int> > orderedList; //first n pixels with the largest determinant values + //determinants[x][y] std::vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2008-02-16 12:51:59
|
Revision: 2865 http://hugin.svn.sourceforge.net/hugin/?rev=2865&view=rev Author: stereo_sl Date: 2008-02-16 04:51:57 -0800 (Sat, 16 Feb 2008) Log Message: ----------- * debug - fixed some issues with descriptor * created MatchPoint executable that(currently) behaves as generatekeys(from autopano) * now the suite can be used as a replacement for generatekeys Modified Paths: -------------- gsoc07_featuredetection/APImage.cpp gsoc07_featuredetection/APImage.h gsoc07_featuredetection/CMakeLists.txt gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp Modified: gsoc07_featuredetection/APImage.cpp =================================================================== --- gsoc07_featuredetection/APImage.cpp 2008-02-16 08:38:25 UTC (rev 2864) +++ gsoc07_featuredetection/APImage.cpp 2008-02-16 12:51:57 UTC (rev 2865) @@ -42,19 +42,54 @@ if(info.isGrayscale()) { // create a gray scale image of appropriate size + vigra::BImage in(info.width(), info.height()); this->imgBW=new BImage(info.width(), info.height()); // import the image just read importImage(info, destImage(*this->imgBW)); } else { - BRGBImage rgbImage(info.width(), info.height()); - importImage(info, destImage(rgbImage)); - // convert to grayscale + BRGBImage in(info.width(), info.height()); + + //TODO: this does not work. How to make a conversion from RGB to BW image in vigra??? this->imgBW=new BImage(info.width(), info.height()); - RGBToGrayAccessor<RGBValue<UInt8> > rgb2g; - copyImage(srcImageRange(rgbImage, rgb2g), destImage(*(this->imgBW))); + + importImage(info, destImage(in)); + + // create image iterator that points to upper left corner + // of source image + vigra::BRGBImage::Iterator sy = in.upperLeft(); + + // create image iterator that points past the lower right corner of + // source image (similarly to the past-the-end iterator in the STL) + vigra::BRGBImage::Iterator send = in.lowerRight(); + + // create image iterator that points to upper left corner + // of destination image + vigra::BImage::Iterator dy = (*this->imgBW).upperLeft(); + + // iterate down the first column of the images + for(; sy.y != send.y; ++sy.y, ++dy.y) + { + // create image iterator that points to the first + // pixel of the current row of the source image + vigra::BRGBImage::Iterator sx = sy; + + // create image iterator that points to the first + // pixel of the current row of the destination image + vigra::BImage::Iterator dx = dy; + + // iterate across current row + for(; sx.x != send.x; ++sx.x, ++dx.x) + { + RGBValue<int,0u,1u,2u> pixel = *sx; + // calculate grayscale value + // Y = 0.3*R + 0.59*G + 0.11*B + *dx = vigra::round(0.3*pixel.red() + 0.59*pixel.green() + 0.11*pixel.blue()); + } + } + //exportAPImage(srcAPImageRange(*this->imgBW), vigra::APImageExportInfo("ttt.jpg")); } return true; } @@ -204,9 +239,16 @@ */ void APImage::integrate() { - cout << "Height:"<< this->getHeightBW() <<"\n"; - cout << "Width:"<< this->getWidthBW() <<"\n"; + /*cout << "Height:"<< this->getHeightBW() <<"\n"; + cout << "Width:"<< this->getWidthBW() <<"\n";*/ + /*for(int i=0;i<10;i++) { + for(int j=0; j<10;j++) { + cout << this->getPixel(j,i)<<" "; + } + cout << "\n"; + }*/ + this->integral.clear(); this->integral.resize(this->getWidthBW()); for(int i=0;i<this->getWidthBW();i++) { @@ -217,6 +259,15 @@ } //cout << "\n"; } + + /*for(int i=0;i<10;i++) { + for(int j=0; j<10;j++) { + cout << this->getIntegralPixel(j,i)<<" "; + } + cout << "\n"; + } + + cout << this->getRegionSum(2,1,2,3) <<"dddddd\n";*/ } int APImage::_getValue4Integral(int x, int y) { if(x==-1 || y==-1) return 0; @@ -239,3 +290,26 @@ string APImage::getPath() { return this->path; } + +void APImage::test() { + // empty edgel list + std::vector<vigra::Edgel> edgels; + + // find edgels at scale of the interest point + vigra::cannyEdgelList(srcIterRange( this->imgBW->upperLeft() + vigra::Diff2D(250, 250), + this->imgBW->upperLeft() + vigra::Diff2D(550, 450)), + edgels, 1.2); + cout << "Size:" << edgels.size() << endl; + vector<vigra::Edgel>::iterator iter2 = edgels.begin(); + int a=0; + while( iter2 != edgels.end()) { //loop over every canny pixel + vigra::Edgel edgePoint=*iter2; + //cout << edgePoint.strength << endl; + if(edgePoint.strength>5) { + this->drawCircle(round(edgePoint.x)+250,round(edgePoint.y)+250,0); + a++; + } + iter2++; + } + cout << a << endl; +} Modified: gsoc07_featuredetection/APImage.h =================================================================== --- gsoc07_featuredetection/APImage.h 2008-02-16 08:38:25 UTC (rev 2864) +++ gsoc07_featuredetection/APImage.h 2008-02-16 12:51:57 UTC (rev 2865) @@ -36,6 +36,7 @@ #include "vigra/imageinfo.hxx" #include "vigra/impex.hxx" #include "vigra/stdimagefunctions.hxx" +#include "vigra/edgedetection.hxx" #endif @@ -65,7 +66,12 @@ bool open(); void show(); + void test(); +#ifdef USE_VIGRA + vigra::BImage* imgBW; +#endif + /* private slots: */ @@ -80,9 +86,7 @@ vector<vector<int> > integral; string path; int _getValue4Integral(int x, int y); -#ifdef USE_VIGRA - vigra::BImage* imgBW; -#endif + /*IplImage* img; IplImage* imgBW;*/ Modified: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt 2008-02-16 08:38:25 UTC (rev 2864) +++ gsoc07_featuredetection/CMakeLists.txt 2008-02-16 12:51:57 UTC (rev 2865) @@ -1,27 +1,25 @@ -PROJECT(opencv) +PROJECT(MatchPoint) #if you don't want the full compiler output, remove the following line #SET(CMAKE_VERBOSE_MAKEFILE ON) # check for opencv -FIND_PATH(OPENCV_INCLUDE_DIR cv.h PATH_SUFFIXES opencv) -INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIR}) +#FIND_PATH(OPENCV_INCLUDE_DIR cv.h PATH_SUFFIXES opencv) +#INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIR}) #add definitions, compiler switches, etc. ADD_DEFINITIONS(-Wall -O2 -g) #list all source files here -ADD_EXECUTABLE(main main.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp) +ADD_EXECUTABLE(MatchPoint MatchPoint.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp) #need to link to some other libraries ? just add them here -#TARGET_LINK_LIBRARIES(main highgui cv cxcore png jpeg) -TARGET_LINK_LIBRARIES(main vigraimpex png jpeg tiff) +TARGET_LINK_LIBRARIES(MatchPoint /usr/lib/libvigraimpex.so png jpeg tiff) #list all source files here -ADD_EXECUTABLE(FeatureMatching FeatureMatching.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) -ADD_EXECUTABLE(gabor_feature_extractor FeatureExtractor.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) +#ADD_EXECUTABLE(MatchPoint.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) +#ADD_EXECUTABLE(matchpoint APImage.cpp HessianDetector.cpp Descriptor.cpp) #need to link to some other libraries ? just add them here #TARGET_LINK_LIBRARIES(FeatureMatching highgui cv cxcore png jpeg) -TARGET_LINK_LIBRARIES(FeatureMatching vigraimpex png jpeg tiff) -TARGET_LINK_LIBRARIES(gabor_feature_extractor vigraimpex png jpeg tiff) +#TARGET_LINK_LIBRARIES(/usr/lib/libvigraimpex.so png jpeg tiff) Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2008-02-16 08:38:25 UTC (rev 2864) +++ gsoc07_featuredetection/Descriptor.cpp 2008-02-16 12:51:57 UTC (rev 2865) @@ -180,7 +180,8 @@ return (1/(2*PI*pow(stdev,2.0)))*exp(-(pow((double)x,2.0)+pow((double)y,2.0))/(2*stdev)); } double Descriptor::_getMaxima(int x,int y) { - return this->hd->getMaxima(x,y); + //return this->hd->getMaxima(x,y); + return 1.6; } double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow((double)(x1-x2),2.0)+pow((double)(y1-y2),2.0)); @@ -625,6 +626,9 @@ void Descriptor::createDescriptors() { +// TODO (zoran#8#): Current version detects edges using canny algorithm in the region around the interest point - here is a lot of redundancy. \ +// Need to change: using vigras cannyEdgeImage first run edge detection on the entire picture and then create desciptors. + cout << "Creating descriptors..."<< endl; int regionSize; int i=0; this->interestPoints->resize(this->interestPoints->size()); @@ -638,12 +642,12 @@ descriptor.push_back(0); } - regionSize=round(20*this->_getMaxima(interestPoint[0], interestPoint[1])); + regionSize=round(40*this->_getMaxima(interestPoint[0], interestPoint[1])); - int xStart=(interestPoint[1]-regionSize); - int xEnd=(interestPoint[1] +regionSize); - int yStart=(interestPoint[0]-regionSize); - int yEnd=(interestPoint[0]+regionSize); + int xStart=(interestPoint[0]-regionSize); + int xEnd=(interestPoint[0] +regionSize); + int yStart=(interestPoint[1]-regionSize); + int yEnd=(interestPoint[1]+regionSize); /* double result; @@ -659,14 +663,21 @@ // empty edgel list std::vector<vigra::Edgel> edgels; + //cout << "Maxima:" << this->_getMaxima(interestPoint[0], interestPoint[1]) << endl; + //cout << "Point:" << interestPoint[0] << "," << interestPoint[1]<< endl; + // find edgels at scale of the interest point vigra::cannyEdgelList(srcIterRange( this->image->imgBW->upperLeft() + vigra::Diff2D(xStart, yStart), this->image->imgBW->upperLeft() + vigra::Diff2D(xEnd, yEnd)), edgels, this->_getMaxima(interestPoint[0], interestPoint[1])); + //cout << "Size:" << edgels.size() << endl; vector<vigra::Edgel>::iterator iter2 = edgels.begin(); while( iter2 != edgels.end()) { //loop over every canny pixel vigra::Edgel edgePoint=*iter2; + /*if(edgePoint.strength<5) { + iter2++; continue; + }*/ //cout << edgePoint.x << ","<<edgePoint.y << "; orientation:"<<edgePoint.orientation<<",strength:"<<edgePoint.strength<<endl; edgePoint.x+=xStart; edgePoint.y+=yStart; @@ -688,13 +699,22 @@ else if(edgePoint.x>=interestPoint[0] && edgePoint.y<=interestPoint[1]) sector=3; else if(edgePoint.x>=interestPoint[0] && edgePoint.y>=interestPoint[1]) sector=0; - double distance=_euclidianDistance(interestPoint[1],interestPoint[0],edgePoint.x,edgePoint.y); - if(distance<=13) descriptor[orientSector*9 + 8]+=edgePoint.strength; - else if(distance>13 && distance<=23) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; - else if(distance>23) descriptor[orientSector*9 + sector*2+1]+=edgePoint.strength; + double distance=_euclidianDistance(interestPoint[0],interestPoint[1],edgePoint.x,edgePoint.y); + distance = sqrt(distance); + + if(distance<=0.78) descriptor[orientSector*9 + 8]+=edgePoint.strength; + else if(distance>0.78 && distance<=1.43) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; + else if(distance>1.43) descriptor[orientSector*9 + sector*2+1]+=edgePoint.strength; + + /*double distance=_euclidianDistance(interestPoint[0],interestPoint[1],edgePoint.x,edgePoint.y); + if(distance<=27) descriptor[orientSector*9 + 8]+=edgePoint.strength; + else if(distance>27 && distance<=50) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; + else if(distance>50) descriptor[orientSector*9 + sector*2+1]+=edgePoint.strength; +*/ + iter2++; } - //cout << "adding d:"<< i<<endl; + this->descriptors.push_back(descriptor); iter1++; } @@ -702,32 +722,41 @@ vector<vector<double> >* Descriptor::getDescriptors() { return &this->descriptors; } -void Descriptor::printDescriptors(std::ostream & o) +bool Descriptor::printDescriptors(string name) { - o << DESCRIPTOR_SIZE << endl; - o << interestPoints->size() << endl; - vector<vector<int> >::iterator iter1 = interestPoints->begin(); - vector<vector<double> >::iterator iterDesc = descriptors.begin(); + ofstream o (name.c_str()); + if (o.is_open()) { + o << DESCRIPTOR_SIZE << endl; + o << interestPoints->size() << endl; + vector<vector<int> >::iterator iter1 = interestPoints->begin(); + vector<vector<double> >::iterator iterDesc = descriptors.begin(); - //int c=0; - while( iter1 != interestPoints->end()) { - vector<int > tmp2=*iter1; - double r = _getMaxima(tmp2[0], tmp2[1])*HD_INIT_KERNEL_SIZE; - o <<tmp2[1]<<" "<<tmp2[0]<<" " << 1/(r*r) << " " << 0 << " " << 1/(r*r) << " "; - for (vector<double>::iterator it = iterDesc->begin(); it != iterDesc->end(); ++it) { - o << *it << " "; - } - o << endl; - iter1++; - iterDesc++; - } + //int c=0; + while( iter1 != interestPoints->end()) { + vector<int > tmp2=*iter1; + double r = _getMaxima(tmp2[0], tmp2[1])*HD_INIT_KERNEL_SIZE; + o <<tmp2[1]<<" "<<tmp2[0]<<" " << 1/(r*r) << " " << 0 << " " << 1/(r*r) << " "; + for (vector<double>::iterator it = iterDesc->begin(); it != iterDesc->end(); ++it) { + o << *it << " "; + } + o << endl; + iter1++; + iterDesc++; + } + o.close(); + return true; + } else return false; } -void Descriptor::printDescriptorsXML(std::ostream &xmlFile) { +bool Descriptor::generateAutopanoXML(string name) { + cout << "Generating XML file: "<<name<<endl; + ofstream xmlFile (name.c_str()); + if (xmlFile.is_open()) + { xmlFile << "<?xml version=\"1.0\" encoding=\"utf-8\"?>"<< endl; xmlFile << "<KeypointXMLList xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; - xmlFile << " <XDim>"<< this->image->getHeight() <<"</XDim>"<< endl; - xmlFile << " <YDim>"<< this->image->getWidth() <<"</YDim>"<< endl; + xmlFile << " <XDim>"<< this->image->getWidth() <<"</XDim>"<< endl; + xmlFile << " <YDim>"<< this->image->getHeight() <<"</YDim>"<< endl; xmlFile << " <ImageFile>"<< this->image->getPath() <<"</ImageFile>"<< endl; xmlFile << " <Arr>"<< endl; @@ -739,8 +768,8 @@ vector<int > tmp2=*iter1; xmlFile << " <KeypointN>"<< endl; - xmlFile << " <X>"<< tmp2[1] <<"</X>"<<endl; - xmlFile << " <Y>"<< tmp2[0] <<"</Y>"<<endl; + xmlFile << " <X>"<< tmp2[0] <<"</X>"<<endl; + xmlFile << " <Y>"<< tmp2[1] <<"</Y>"<<endl; xmlFile << " <Scale>"<< this->_getMaxima(tmp2[0],tmp2[1]) <<"</Scale>"<<endl; xmlFile << " <Orientation>"<< 0 <<"</Orientation>"<<endl; xmlFile << " <Dim>"<< DESCRIPTOR_SIZE <<"</Dim>"<<endl; @@ -759,4 +788,9 @@ xmlFile << " </Arr>"<< endl; xmlFile << "</KeypointXMLList>"<< endl; + + xmlFile.close(); + return true; + } + else return false; } Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2008-02-16 08:38:25 UTC (rev 2864) +++ gsoc07_featuredetection/Descriptor.h 2008-02-16 12:51:57 UTC (rev 2865) @@ -39,8 +39,8 @@ void orientate(); void createDescriptors(); vector<vector<double> >* getDescriptors(); - void printDescriptors(std::ostream & o); - void printDescriptorsXML(std::ostream & o); + bool printDescriptors(string name); + bool generateAutopanoXML(string name); vector<vector<int> >* interestPoints; @@ -59,4 +59,7 @@ vector<vector<double> > descriptors; int orientations[]; }; + + + #endif // DESCRIPTOR_H_INCLUDED Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2008-02-16 08:38:25 UTC (rev 2864) +++ gsoc07_featuredetection/HessianDetector.cpp 2008-02-16 12:51:57 UTC (rev 2865) @@ -60,7 +60,6 @@ } else if(this->convolutionType==HD_SLIDING_WINDOW) { return this->_slidingWDetect(); } - return false; } bool HessianDetector::_slidingWDetect() { @@ -227,6 +226,7 @@ } bool HessianDetector::_boxFilterDetect() { + int height = this->image->getHeightBW(); int width = this->image->getWidthBW(); @@ -236,8 +236,8 @@ const int iMax=std::numeric_limits<int>::max(); - int offsetX=width*0.05; - int offsetY=height*0.05; + int offsetX=width*0.15; + int offsetY=height*0.15; int xStart=offsetX; int yStart=offsetY; @@ -255,6 +255,8 @@ vector<vector<int> >::iterator it; it = orderedList.begin(); + double sum=0; + double count=0; //point (x,y) => (j,i) for(int j=yStart;j<yEnd;j++) { for(int i=xStart; i<xEnd;i++) { @@ -265,6 +267,8 @@ * This can also be done in a loop. * */ + count++; + sum+=determinants[i][j]; if(determinants[i][j]>determinants[i-1][j-1] && determinants[i][j]>determinants[i-1][j] && @@ -273,11 +277,12 @@ determinants[i][j]>determinants[i][j+1] && determinants[i][j]>determinants[i+1][j-1] && determinants[i][j]>determinants[i+1][j] && - determinants[i][j]>determinants[i+1][j+1]) { - this->_insertToList(&i,&j); + determinants[i][j]>determinants[i+1][j+1] && + determinants[i][j]>25000) { + //this->_insertToList(&i,&j); /*cout << maximas[i][j]<<","<<determinants[i][j]<< ";"; cout << i<<","<<j<< "\n";*/ - /*vector<int> point; + vector<int> point; point.resize(2); point[0]=i; @@ -285,13 +290,14 @@ this->orderedList.push_back(point); //it = orderedList.insert ( it , point); -*/ + } //cout << maximas[i][j]<<","<<determinants[i][j]<< " "; } //cout << "\n"; } cout << "Detected points:"<< this->orderedList.size() <<" "; + cout << "Average:"<< sum/count <<" "; return true; } @@ -304,8 +310,7 @@ 15,27,39,51, 21,45,69,93 }; - double interp1; - double interp2; + double interp1, interp2; //first octave interp1=(this->_convolutePixel(&x,&y,&octaves[0][0])+this->_convolutePixel(&x,&y,&octaves[0][1]))/2; @@ -554,6 +559,7 @@ } return det; } + void HessianDetector::_insertToList(int* x, int* y) { vector<int> point; point.resize(2); @@ -602,7 +608,7 @@ //int c=0; while( iter1 != orderedList.end()) { vector<int > tmp2=*iter1; - //cout << "("<<tmp2[0]<<","<<tmp2[1]<<","<<tmp2[2]<<")\n"; + cout << "("<<tmp2[0]<<","<<tmp2[1]<<","<<tmp2[2]<<")\n"; this->image->drawCircle(tmp2[0],tmp2[1],maximas[tmp2[0]][tmp2[1]]*HD_INIT_KERNEL_SIZE); //c++; //this->image->drawCircle(tmp2[1],tmp2[0],1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2008-02-16 12:54:49
|
Revision: 2866 http://hugin.svn.sourceforge.net/hugin/?rev=2866&view=rev Author: stereo_sl Date: 2008-02-16 04:54:43 -0800 (Sat, 16 Feb 2008) Log Message: ----------- Added Paths: ----------- gsoc07_featuredetection/MatchPoint.cpp Removed Paths: ------------- gsoc07_featuredetection/FeatureExtractor.cpp gsoc07_featuredetection/FeatureMatcher.cpp gsoc07_featuredetection/FeatureMatcher.h gsoc07_featuredetection/FeatureMatching.cpp Deleted: gsoc07_featuredetection/FeatureExtractor.cpp =================================================================== --- gsoc07_featuredetection/FeatureExtractor.cpp 2008-02-16 12:51:57 UTC (rev 2865) +++ gsoc07_featuredetection/FeatureExtractor.cpp 2008-02-16 12:54:43 UTC (rev 2866) @@ -1,166 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Zoran Mesec * - * zor...@gm... * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -//#define USE_OPENCV -//#define USE_QT -#define USE_VIGRA - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <iostream> -#include <fstream> -#include <stdlib.h> -#include <ctime> - -#include <string> -#include "APImage.h" -#include "HessianDetector.h" -#include "Descriptor.h" -#include "FeatureMatcher.h" - -using namespace std; - -void usage() -{ - cout << "FeatureMatching: run feature detection and extraction" << endl - << endl - << "Usage: FeatureMatching [options] image1.jpg" << endl - << "Options:" << endl - - << " -x generate xml suitable for Autopano-SIFT feature matcher" << endl - << " -o file generate XML file with interest points and descriptors(image1.jpg.xml, image2.jpg.xml)" << endl - << " -n num extract num interest points an descriptors" << endl - << " -v verbose output" << endl - //<< " TODO: replace with threshold, default 1000" << endl - << "Arguments:" << endl - << " image1.jpg first image to be analyzed." << endl - << endl; -} - -int main(int argc, char *argv[]) -{ - if(argc==1) { - usage(); - return 0; - } - const char * optstring = ":h:n:o:xv"; - char c; - clock_t start,finish; - double time; - - bool verbose = false; - string input1; - bool generateXML=false; - string output; - - int nrPoints = 4000; - - // parse arguments - while ((c = getopt (argc, argv, optstring)) != -1) - { - switch(c) { - case 'v': - verbose = true; - break; - case 'x': - generateXML=true; - break; - case 'o': - output = optarg; - break; - case 'n': - nrPoints = atoi(optarg); - break; - case 'h': - usage(); - return 0; - break; - default: - usage(); - return 0; - } - } - - if (optind+1 != argc) { - usage(); - return 1; - } - input1=argv[optind]; - -/*for (index = optind; index < argc; index++) { - printf ("Non-option argument %s\n", argv[index]); - } - return 0;*/ - - if (verbose) cerr << "Number of detected points:" << nrPoints<<endl; - - APImage im1(input1); - if(!im1.open()) { - cerr<< "Error! Image can not be opened"<<"\n"; - return 0; - } - - //need to integrate the image before the detection process(only if using box filter approximation) - im1.integrate(); - - if (verbose) cerr << "Starting detector..."<<endl; - start = clock(); - - HessianDetector hd1(&im1,nrPoints, HD_BOX_FILTERS,1); - if(!hd1.detect()) { - cerr << "Detection of points failed!"; - return 1; - } - //print points and display image with the detected points(debugging only) - /*hd1.printPoints(); - return 0;*/ - - finish = clock(); - - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - if (verbose) cerr << "...detection of points finished. Measured time:"<<time<<endl; - - - Descriptor d1(&im1,&hd1); - d1.setPoints(hd1.getPoints()); - //d.orientate(); - d1.createDescriptors(); - if (output.size() > 0) { - ofstream outFile (output.c_str()); - if (outFile.is_open()) { - if(generateXML) - d1.printDescriptorsXML(outFile); - else - d1.printDescriptors(outFile); - } else { - cerr << "Could not open output file " << output << endl; - return 1; - } - } else { - if(generateXML) - d1.printDescriptorsXML(cout); - else - d1.printDescriptors(cout); - } - return 0; -} - Deleted: gsoc07_featuredetection/FeatureMatcher.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatcher.cpp 2008-02-16 12:51:57 UTC (rev 2865) +++ gsoc07_featuredetection/FeatureMatcher.cpp 2008-02-16 12:54:43 UTC (rev 2866) @@ -1,123 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Zoran Mesec * - * zor...@gm... * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ - -#include <stdio.h> -#include <iostream> -#include <fstream> -#include <stdlib.h> -#include "FeatureMatcher.h" - - -FeatureMatcher::FeatureMatcher(int nrCP, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt) { - this->descriptor1 = d1; - this->descriptor2 = d2; - this->matchingType = mt; - this->nrControlPoints = nrCP; - - vector<int> point; - point.resize(2); - - this->controlPoints.reserve(sizeof(point)*this->nrControlPoints); - -} - -void FeatureMatcher::match(double threshold) { - vector<vector<double> >* descriptors1=this->descriptor1->getDescriptors(); - vector<vector<double> >::iterator iter1 = descriptors1->begin(); - - vector<vector<double> >* descriptors2=this->descriptor2->getDescriptors(); - - int pointCount=0; - int cpCount=0; //matched points counter - int max; - int maxId; //position int the vector of the nearest neighbour - - vector<int> controlPoint; - - while( iter1 != descriptors1->end()) { - vector<double> current1 = *iter1; - - vector<vector<double> >::iterator iter2 =descriptors2->begin(); - - max=1; - maxId=0; - - vector<double> current2 = *iter2; - - double distance=_getDistance(¤t1,¤t2); - iter2++; - double diff=distance; //nearest neighbour - double diff2=std::numeric_limits<double>::max(); //second nearest neighbour - - while( iter2 != descriptors2->end()) { - current2 = *iter2; - distance=_getDistance(¤t1,¤t2); - - if(distance<diff) { - diff2=diff; - diff=distance; - maxId=max; - } else if(distance<diff2) { - //set the new second nearest neighbour - diff2=distance; - } - max++; - iter2++; - } - - if(diff<(threshold*diff2)) { - - controlPoint.clear(); - controlPoint.push_back((*this->descriptor2->interestPoints)[maxId][0]); - controlPoint.push_back((*this->descriptor2->interestPoints)[maxId][1]); - controlPoint.push_back((*this->descriptor1->interestPoints)[pointCount][0]); - controlPoint.push_back((*this->descriptor1->interestPoints)[pointCount][1]); - - this->controlPoints.push_back(controlPoint); - cpCount++; - } - iter1++; - pointCount++; - } - this->nrControlPoints = cpCount; -} -/*void FeatureMatcher::printCtrlPoints() { - vector<vector<int> >::iterator iter1 = this->controlPoints.begin(); - while( iter1 != this->controlPoints.end()) { - vector<int> current1 = *iter1; - im1.drawCircle(current1[1],current1[0],10); - im2.drawCircle(current1[3],current1[2],10); - } - -}*/ -vector<vector<int> > FeatureMatcher::getCtrlPoints() { - return this->controlPoints; -} -int FeatureMatcher::getNrPoints() { - return this->nrControlPoints; -} - -double FeatureMatcher::_getDistance(vector<double>* d1,vector<double>* d2) { -double dist=0; -for(int i=0; i<DESCRIPTOR_SIZE;i++) { - dist+=pow((*d1)[i]-(*d2)[i],2); -} -return dist; -} Deleted: gsoc07_featuredetection/FeatureMatcher.h =================================================================== --- gsoc07_featuredetection/FeatureMatcher.h 2008-02-16 12:51:57 UTC (rev 2865) +++ gsoc07_featuredetection/FeatureMatcher.h 2008-02-16 12:54:43 UTC (rev 2866) @@ -1,51 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Zoran Mesec * - * zor...@gm... * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ - -#ifndef FEATUREMATCHER_H_ -#define FEATUREMATCHER_H_ - -#define FM_MATCHING_TYPE int -#define FM_SECOND_NN 1 - -#include "Descriptor.h" - -class FeatureMatcher - { - public: - FeatureMatcher(int nrCP, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt=FM_SECOND_NN); - - void match(double threshold=0.7); - //void addDescriptor(Descriptor* descriptor) - vector<vector<int> > getCtrlPoints(); - int getNrPoints(); - //void printCtrlPoints(); - //void setPoints(vector<vector<double> >* desc); - - private: - Descriptor* descriptor1; - Descriptor* descriptor2; - FM_MATCHING_TYPE matchingType; - int nrControlPoints; - double _getDistance(vector<double>* d1,vector<double>* d2); - - vector<vector<int> > controlPoints; // form: {x1,y1,x2,y2} - - }; -#endif /*FEATUREMATCHER_H_*/ Deleted: gsoc07_featuredetection/FeatureMatching.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatching.cpp 2008-02-16 12:51:57 UTC (rev 2865) +++ gsoc07_featuredetection/FeatureMatching.cpp 2008-02-16 12:54:43 UTC (rev 2866) @@ -1,212 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Zoran Mesec * - * zor...@gm... * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -//#define USE_OPENCV -//#define USE_QT -#define USE_VIGRA - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <iostream> -#include <fstream> -#include <stdlib.h> -#include <ctime> - -#include <string> -#include "APImage.h" -#include "HessianDetector.h" -#include "Descriptor.h" -#include "FeatureMatcher.h" - -using namespace std; - -void usage() -{ - cout << "FeatureMatching: run feature detection and extraction" << endl - << endl - << "Usage: FeatureMatching [options] image1.jpg image2.jpg" << endl - << "Options:" << endl - - << " -o generate XML file with interest points and descriptors(image1.jpg.xml, image2.jpg.xml)" << endl - << " -n num extract num interest points an descriptors" << endl - //<< " TODO: replace with threshold, default 1000" << endl - << "Arguments:" << endl - << " image1.jpg first image to be analyzed." << endl - << " image2.jpg second image to be analyzed." << endl - << endl; -} - -int main(int argc, char *argv[]) -{ - if(argc==1) { - usage(); - return 0; - } - const char * optstring = ":h:n:o"; - char c; - clock_t start,finish; - double time; - - string input1; - string input2; - bool generateXML=false; - - int nrPoints = 4000; - - // parse arguments - while ((c = getopt (argc, argv, optstring)) != -1) - { - switch(c) { - case 'o': - generateXML=true; - break; - case 'n': - nrPoints = atoi(optarg); - break; - case 'h': - usage(); - return 0; - break; - default: - usage(); - return 0; - } - } - - input1=argv[optind]; - input2=argv[optind+1]; - -/*for (index = optind; index < argc; index++) { - printf ("Non-option argument %s\n", argv[index]); - } - return 0;*/ - cout << "Image file1:" << input1<<endl; - cout << "Image file2:" << input2<<endl; - - cout << "Number of detected points:" << nrPoints<<endl; - - APImage im1(input1); - if(!im1.open()) { - cout<< "Error! Image can not be opened"<<"\n"; - return 0; - } - - APImage im2(input2); - if(!im2.open()) { - cout<< "Error! Image can not be opened"<<"\n"; - return 0; - } - - //need to integrate the image before the detection process(only if using box filter approximation) - im1.integrate(); - im2.integrate(); - - cout << "Starting detector 1..."<<endl; - start = clock(); - - HessianDetector hd1(&im1,nrPoints, HD_BOX_FILTERS,1); - if(!hd1.detect()) { - cout << "Detection of points failed!"; - return 1; - } - //print points and display image with the detected points(debugging only) - /*hd1.printPoints(); - return 0;*/ - - finish = clock(); - - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - cout << "...detection of points finished. Measured time:"<<time<<endl; - - - Descriptor d1(&im1,&hd1); - d1.setPoints(hd1.getPoints()); - //d.orientate(); - d1.createDescriptors(); - if(generateXML) { - std::ofstream outFile (input1.append(".xml").c_str()); - if (outFile.is_open()) { - d1.printDescriptorsXML(outFile); - } - } - - /*d1.printDescriptors(cout); - return 0;*/ - - HessianDetector hd2(&im2,nrPoints, HD_BOX_FILTERS,1); - if(!hd2.detect()) { - cout << "Detection of points failed!"; - return 1; - } - //print points and display image with the detected points(debugging only) - //hd2.printPoints(); - - Descriptor d2(&im2,&hd2); - d2.setPoints(hd2.getPoints()); - //d.orientate(); - d2.createDescriptors(); - if(generateXML) { - ofstream outFile (input2.append(".xml").c_str()); - if (outFile.is_open()) { - d1.printDescriptorsXML(outFile); - } - } - - cout << "Matching..."<<endl; - - FeatureMatcher fm(nrPoints, &d1, &d2, FM_SECOND_NN); - fm.match(0.5); - - - vector<int> point; - point.resize(4); - - vector<vector<int> > cps; - cps.reserve(sizeof(point)*fm.getNrPoints()); - cps=fm.getCtrlPoints(); - - cout << "...matching ended." << endl; - int size = cps.size(); - //cout << "Nr of control points:"<< size <<endl; - //cout << "Control points:"<<endl; - //cout << "(x1\ty1\t:\tx2\ty2)"<<endl; - - vector<vector<int> >::iterator iter1 =cps.begin(); - - cout << "p w3000 h1500 f0 v360 o\"TIFF_m\""<< endl << endl - << "i n\"" << input1 << "\" f0 v50 a0" << endl - << "i n\"" << input2 << "\" f0 v50 a=0" << endl << endl; - - while( iter1 != cps.end()) { - vector<int> current = *iter1; - //cout << current[0] << "\t" << current[1] << "\t" << ":" << "\t" << current[2] << "\t" << current[3] << endl ; - // output in a pto file compatible format - cout << "c n0 N1 x" << current[0] << " y" << current[1] << " X" << current[2] << " Y" << current[3] << " t0" << endl ; - im1.drawCircle(current[2],current[3],10); - im2.drawCircle(current[0],current[1],10); - iter1++; - } - - im1.show(); - im2.show(); -} - Added: gsoc07_featuredetection/MatchPoint.cpp =================================================================== --- gsoc07_featuredetection/MatchPoint.cpp (rev 0) +++ gsoc07_featuredetection/MatchPoint.cpp 2008-02-16 12:54:43 UTC (rev 2866) @@ -0,0 +1,151 @@ +/*************************************************************************** + * Copyright (C) 2007 by Zoran Mesec * + * zor...@gm... * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +//#define USE_OPENCV +//#define USE_QT +#define USE_VIGRA + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <iostream> +#include <stdlib.h> +#include <math.h> +#include <ctime> +#include <algorithm> + +#include <string> +#include "APImage.h" +#include "HessianDetector.h" +#include "Descriptor.h" +#include <limits> + +using namespace std; + +void usage() +{ + cout << "MatchPoint: run feature detection and extraction" << endl + << endl + << "Usage: MatchPoint [options] image1.jpg output.key" << endl + << "Options:" << endl + + /* // << " -x generate xml suitable for Autopano-SIFT feature matcher" << endl + << " -o file generate XML file with interest points and descriptors(image1.jpg.xml, image2.jpg.xml)" << endl + << " -n num extract num interest points an descriptors" << endl*/ + << " -v verbose output" << endl + << " -t generate keypoint file for matlab test suite(file name is generated using formula: image1.jpg.key)" << endl + //<< " TODO: replace with threshold, default 1000" << endl + << "Arguments:" << endl + << " image1.jpg Path to image to be analyzed." << endl + << " output.key Output keypoint file.." << endl + << endl; +} + + +int main(int argc, char *argv[]) +{ + + + + const char * optstring = "hvt"; + char c; + clock_t start,finish; + double time; + + bool verbose = false; + bool testFileOutput = false; + string input1; + string output; + + // parse arguments + while ((c = getopt (argc, argv, optstring)) != -1) + { + switch(c) { + case 'v': + verbose = true; + break; + case 't': + testFileOutput=true; + break; + /*case 'o': + output = optarg; + break; + case 'n': + nrPoints = atoi(optarg); + break;*/ + case 'h': + usage(); + //return 0; + break; + default: + usage(); + return 0; + } + //optind++; + } + + if (optind+2 != argc) { + usage(); + return 1; + } + + input1=argv[optind]; + output=argv[optind+1]; + if (verbose) cerr << "Input image: " <<input1 << "; Output key file: "<<output<<endl; + + APImage im1(input1); + if(!im1.open()) { + cerr<< "Error! Image can not be opened"<<"\n"; + return 0; + } + + //need to integrate the image before the detection process(only if using box filter approximation) + im1.integrate(); + + start = clock(); + + HessianDetector hd1(&im1,0, HD_BOX_FILTERS,1); + if(!hd1.detect()) { + cerr << "Detection of points failed!"; + return 1; + } + + finish = clock(); + + time = (double(finish)-double(start))/CLOCKS_PER_SEC; + cout << "Measured time:"<<time<<"\n"; + + vector<vector<int> >* interestPoints1=hd1.getPoints(); + + Descriptor d1(&im1,&hd1); + d1.setPoints(interestPoints1); + //d.orientate(); + d1.createDescriptors(); + //string name="test1.xml"; + + if(testFileOutput) { + if (verbose) cerr << "Generating output file for matlab test suite: " <<input1.append(".key") << endl; + d1.printDescriptors(input1.append(".key")); //for matlab test suite + } + d1.generateAutopanoXML(output); + + return EXIT_SUCCESS; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2008-03-02 16:38:06
|
Revision: 2917 http://hugin.svn.sourceforge.net/hugin/?rev=2917&view=rev Author: stereo_sl Date: 2008-03-02 08:38:03 -0800 (Sun, 02 Mar 2008) Log Message: ----------- Features: * debug - fixed some issues with shape context descriptor * copy pasted vigra's file and modified it * implemented new orientation assignment from CannyEdge detection Todo: * copy 3 changed functions for CannyEdge detection from edgedetection.hxx(and then discard this file) to APImage.h and APImage.cpp Modified Paths: -------------- gsoc07_featuredetection/APImage.cpp gsoc07_featuredetection/APImage.h gsoc07_featuredetection/CMakeLists.txt gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/MatchPoint.cpp Modified: gsoc07_featuredetection/APImage.cpp =================================================================== --- gsoc07_featuredetection/APImage.cpp 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/APImage.cpp 2008-03-02 16:38:03 UTC (rev 2917) @@ -291,14 +291,122 @@ return this->path; } +/*double APImage::getPointOrientation(int x, int y) { + + return 0.0; +}*/ + +template <class SrcIterator, class SrcAccessor, class BackInsertable> +void APImage::_cannyEdgelList1(triple<SrcIterator, SrcIterator, SrcAccessor> src, + BackInsertable & edgels, double scale,vector<int>* point ) +{ + _cannyEdgelList(src.first, src.second, src.third, edgels, scale, point); +} + +template <class SrcIterator, class SrcAccessor, class BackInsertable> +void APImage::_cannyEdgelList(SrcIterator ul, SrcIterator lr, SrcAccessor src, + BackInsertable & edgels, double scale, vector<int>* point) +{ + int w = lr.x - ul.x; + int h = lr.y - ul.y; + + // calculate image gradients + typedef typename + NumericTraits<typename SrcAccessor::value_type>::RealPromote + TmpType; + + BasicImage<TmpType> tmp(w,h), dx(w,h), dy(w,h); + + Kernel1D<double> smooth, grad; + + smooth.initGaussian(scale); + grad.initGaussianDerivative(scale, 1); + + separableConvolveX(srcIterRange(ul, lr, src), destImage(tmp), kernel1d(grad)); + separableConvolveY(srcImageRange(tmp), destImage(dx), kernel1d(smooth)); + + separableConvolveY(srcIterRange(ul, lr, src), destImage(tmp), kernel1d(grad)); + separableConvolveX(srcImageRange(tmp), destImage(dy), kernel1d(smooth)); + + combineTwoImages(srcImageRange(dx), srcImage(dy), destImage(tmp), + MagnitudeFunctor<TmpType>()); + + + // find edgels + internalCannyFindEdgels(dx, dy, tmp, edgels, point); +} + +template <class Image1, class Image2, class BackInsertable> +void APImage::_internalCannyFindEdgels(Image1 const & gx, + Image1 const & gy, + Image2 const & magnitude, + BackInsertable & edgels, vector<int>* p) +{ + typedef typename Image1::value_type PixelType; + double t = 0.5 / VIGRA_CSTD::sin(M_PI/8.0); + + //last element in edgel list is edgel that holds orientation + //of interest point + + //orientation assignment + vector<int > point= *p; + PixelType gradx = gx(p[0],p[1]); + PixelType grady = gy(p[0],p[1]); + + double orientation = VIGRA_CSTD::atan2(-grady, gradx) - M_PI * 1.5; + if(orientation < 0.0) + orientation += 2.0*M_PI; + Edgel edgel; + edgel.orientation=orientation; + edgels.push_back(edgel); + //EOF orientation assignment + + for(int y=1; y<gx.height()-1; ++y) + { + for(int x=1; x<gx.width()-1; ++x) + { + gradx = gx(x,y); + grady = gy(x,y); + double mag = magnitude(x, y); + + int dx = (int)VIGRA_CSTD::floor(gradx*t/mag + 0.5); + int dy = (int)VIGRA_CSTD::floor(grady*t/mag + 0.5); + + int x1 = x - dx, + x2 = x + dx, + y1 = y - dy, + y2 = y + dy; + + PixelType m1 = magnitude(x1, y1); + PixelType m3 = magnitude(x2, y2); + + if(m1 < mag && m3 <= mag) + { + Edgel edgel; + + // local maximum => quadratic interpolation of sub-pixel location + PixelType del = (m1 - m3) / 2.0 / (m1 + m3 - 2.0*mag); + edgel.x = x + dx*del; + edgel.y = y + dy*del; + edgel.strength = mag; + orientation = VIGRA_CSTD::atan2(-grady, gradx) - M_PI * 1.5; + if(orientation < 0.0) + orientation += 2.0*M_PI; + edgel.orientation = orientation; + edgels.push_back(edgel); + } + } + } +} + void APImage::test() { // empty edgel list - std::vector<vigra::Edgel> edgels; + /*std::vector<vigra::Edgel> edgels; // find edgels at scale of the interest point vigra::cannyEdgelList(srcIterRange( this->imgBW->upperLeft() + vigra::Diff2D(250, 250), this->imgBW->upperLeft() + vigra::Diff2D(550, 450)), - edgels, 1.2); + edgels, 1.2, ); cout << "Size:" << edgels.size() << endl; vector<vigra::Edgel>::iterator iter2 = edgels.begin(); int a=0; @@ -311,5 +419,5 @@ } iter2++; } - cout << a << endl; + cout << a << endl;*/ } Modified: gsoc07_featuredetection/APImage.h =================================================================== --- gsoc07_featuredetection/APImage.h 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/APImage.h 2008-03-02 16:38:03 UTC (rev 2917) @@ -36,11 +36,21 @@ #include "vigra/imageinfo.hxx" #include "vigra/impex.hxx" #include "vigra/stdimagefunctions.hxx" -#include "vigra/edgedetection.hxx" +#include "edgedetection.hxx" +#include "vigra/utilities.hxx" +#include "vigra/numerictraits.hxx" + +#include "vigra/recursiveconvolution.hxx" +#include "vigra/separableconvolution.hxx" +#include "vigra/labelimage.hxx" +#include "vigra/mathutil.hxx" +#include "vigra/pixelneighborhood.hxx" +#include "vigra/linear_solve.hxx" #endif using namespace std; + using namespace vigra; class APImage { @@ -68,6 +78,11 @@ void show(); void test(); + template <class SrcIterator, class SrcAccessor, class BackInsertable> + void _cannyEdgelList1(vigra::triple<SrcIterator, SrcIterator, SrcAccessor> src, + BackInsertable & edgels, double scale, vector<int>* p); + + #ifdef USE_VIGRA vigra::BImage* imgBW; #endif @@ -87,6 +102,16 @@ string path; int _getValue4Integral(int x, int y); + template <class SrcIterator, class SrcAccessor, class BackInsertable> + inline void _cannyEdgelList(SrcIterator ul, SrcIterator lr, SrcAccessor src, + BackInsertable & edgels, double scale, vector<int>* point); + + template <class Image1, class Image2, class BackInsertable> + void _internalCannyFindEdgels(Image1 const & gx, + Image1 const & gy, + Image2 const & magnitude, + BackInsertable & edgels, vector<int>* p); + /*IplImage* img; IplImage* imgBW;*/ Modified: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/CMakeLists.txt 2008-03-02 16:38:03 UTC (rev 2917) @@ -12,7 +12,7 @@ ADD_DEFINITIONS(-Wall -O2 -g) #list all source files here -ADD_EXECUTABLE(MatchPoint MatchPoint.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp) +ADD_EXECUTABLE(MatchPoint MatchPoint.cpp APImage.cpp HessianDetector.cpp Descriptor.cpp edgedetection.hxx) #need to link to some other libraries ? just add them here TARGET_LINK_LIBRARIES(MatchPoint /usr/lib/libvigraimpex.so png jpeg tiff) Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/Descriptor.cpp 2008-03-02 16:38:03 UTC (rev 2917) @@ -72,7 +72,7 @@ vector<int > interestPoint=*iter1; //cout << interestPoint[0]<<","<<interestPoint[1]<<":"; regionSize=_getMaxima(interestPoint[0], interestPoint[1])*3; - kernelSize=round(_getMaxima(interestPoint[0], interestPoint[1])*2); + kernelSize=vigra::round(_getMaxima(interestPoint[0], interestPoint[1])*2); step=_getMaxima(interestPoint[0], interestPoint[1]); for(int i=0; i<NR_ANGLE_BINS;i++) { @@ -91,8 +91,8 @@ for(double j=(interestPoint[1]-regionSize); j<=(interestPoint[1]+regionSize);j+=step) { //pixels have integer values - pointX=round(i); - pointY=round(j); + pointX=vigra::round(i); + pointY=vigra::round(j); //pointX and pointY are the coordinates of the sample point double dist=_euclidianDistance(interestPoint[0],interestPoint[1], pointX,pointY); @@ -162,13 +162,13 @@ } } - orientation=round(atan2(Sy[orientation],Sx[orientation]) * 180 / PI); + orientation=vigra::round(atan2(Sy[orientation],Sx[orientation]) * 180 / PI); //if(orientation<0) orientation=360+orientation; this->orientations[pointCount]=orientation; this->image->drawCircle(interestPoint[1],interestPoint[0],1); - this->image->drawLine(interestPoint[1],interestPoint[0],interestPoint[1]+round(sin(orientation)*10),interestPoint[0]+round(cos(orientation)*10)); + this->image->drawLine(interestPoint[1],interestPoint[0],interestPoint[1]+vigra::round(sin(orientation)*10),interestPoint[0]+vigra::round(cos(orientation)*10)); //cout << orientation << "\n"; iter1++; //pointCount++; @@ -180,8 +180,8 @@ return (1/(2*PI*pow(stdev,2.0)))*exp(-(pow((double)x,2.0)+pow((double)y,2.0))/(2*stdev)); } double Descriptor::_getMaxima(int x,int y) { - //return this->hd->getMaxima(x,y); - return 1.6; + return this->hd->getMaxima(x,y); + //return 1.6; } double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow((double)(x1-x2),2.0)+pow((double)(y1-y2),2.0)); @@ -547,40 +547,40 @@ for(int i=0; i<6; i++) { - descriptor[0]+=this->image->getPixel(round(x+factor*gabor11[i][0]),round(y+factor*gabor11[i][1]))*gabor11[i][2]; - descriptor[2]+=this->image->getPixel(round(x+factor*gabor21[i][0]),round(y+factor*gabor21[i][1]))*gabor21[i][2]; - descriptor[4]+=this->image->getPixel(round(x+factor*gabor31[i][0]),round(y+factor*gabor31[i][1]))*gabor31[i][2]; - descriptor[6]+=this->image->getPixel(round(x+factor*gabor41[i][0]),round(y+factor*gabor41[i][1]))*gabor41[i][2]; + descriptor[0]+=this->image->getPixel(vigra::round(x+factor*gabor11[i][0]),vigra::round(y+factor*gabor11[i][1]))*gabor11[i][2]; + descriptor[2]+=this->image->getPixel(vigra::round(x+factor*gabor21[i][0]),vigra::round(y+factor*gabor21[i][1]))*gabor21[i][2]; + descriptor[4]+=this->image->getPixel(vigra::round(x+factor*gabor31[i][0]),vigra::round(y+factor*gabor31[i][1]))*gabor31[i][2]; + descriptor[6]+=this->image->getPixel(vigra::round(x+factor*gabor41[i][0]),vigra::round(y+factor*gabor41[i][1]))*gabor41[i][2]; - descriptor[1]+=this->image->getPixel(round(x+factor*gabor12[i][0]),round(x+factor*gabor12[i][1]))*gabor12[i][2]; - descriptor[3]+=this->image->getPixel(round(x+factor*gabor22[i][0]),round(x+factor*gabor22[i][1]))*gabor22[i][2]; - descriptor[5]+=this->image->getPixel(round(x+factor*gabor32[i][0]),round(x+factor*gabor32[i][1]))*gabor32[i][2]; - descriptor[7]+=this->image->getPixel(round(x+factor*gabor42[i][0]),round(x+factor*gabor42[i][1]))*gabor42[i][2]; + descriptor[1]+=this->image->getPixel(vigra::round(x+factor*gabor12[i][0]),vigra::round(x+factor*gabor12[i][1]))*gabor12[i][2]; + descriptor[3]+=this->image->getPixel(vigra::round(x+factor*gabor22[i][0]),vigra::round(x+factor*gabor22[i][1]))*gabor22[i][2]; + descriptor[5]+=this->image->getPixel(vigra::round(x+factor*gabor32[i][0]),vigra::round(x+factor*gabor32[i][1]))*gabor32[i][2]; + descriptor[7]+=this->image->getPixel(vigra::round(x+factor*gabor42[i][0]),vigra::round(x+factor*gabor42[i][1]))*gabor42[i][2]; } for(int i=0; i<10;i++) { - descriptor[8]+=this->image->getPixel(round(x+factor*gabor13[i][0]),round(y+factor*gabor13[i][1]))*gabor13[i][2]; - descriptor[9]+=this->image->getPixel(round(x+factor*gabor23[i][0]),round(y+factor*gabor23[i][1]))*gabor23[i][2]; - descriptor[10]+=this->image->getPixel(round(x+factor*gabor33[i][0]),round(y+factor*gabor33[i][1]))*gabor33[i][2]; - descriptor[11]+=this->image->getPixel(round(x+factor*gabor43[i][0]),round(y+factor*gabor43[i][1]))*gabor43[i][2]; + descriptor[8]+=this->image->getPixel(vigra::round(x+factor*gabor13[i][0]),vigra::round(y+factor*gabor13[i][1]))*gabor13[i][2]; + descriptor[9]+=this->image->getPixel(vigra::round(x+factor*gabor23[i][0]),vigra::round(y+factor*gabor23[i][1]))*gabor23[i][2]; + descriptor[10]+=this->image->getPixel(vigra::round(x+factor*gabor33[i][0]),vigra::round(y+factor*gabor33[i][1]))*gabor33[i][2]; + descriptor[11]+=this->image->getPixel(vigra::round(x+factor*gabor43[i][0]),vigra::round(y+factor*gabor43[i][1]))*gabor43[i][2]; - descriptor[12]+=this->image->getPixel(round(x+factor*gabor53[i][0]),round(x+factor*gabor53[i][1]))*gabor53[i][2]; - descriptor[13]+=this->image->getPixel(round(x+factor*gabor63[i][0]),round(x+factor*gabor63[i][1]))*gabor63[i][2]; - descriptor[14]+=this->image->getPixel(round(x+factor*gabor73[i][0]),round(x+factor*gabor73[i][1]))*gabor73[i][2]; - descriptor[15]+=this->image->getPixel(round(x+factor*gabor83[i][0]),round(x+factor*gabor83[i][1]))*gabor83[i][2]; + descriptor[12]+=this->image->getPixel(vigra::round(x+factor*gabor53[i][0]),vigra::round(x+factor*gabor53[i][1]))*gabor53[i][2]; + descriptor[13]+=this->image->getPixel(vigra::round(x+factor*gabor63[i][0]),vigra::round(x+factor*gabor63[i][1]))*gabor63[i][2]; + descriptor[14]+=this->image->getPixel(vigra::round(x+factor*gabor73[i][0]),vigra::round(x+factor*gabor73[i][1]))*gabor73[i][2]; + descriptor[15]+=this->image->getPixel(vigra::round(x+factor*gabor83[i][0]),vigra::round(x+factor*gabor83[i][1]))*gabor83[i][2]; } for(int i=0; i<17;i++) { - descriptor[16]+=this->image->getPixel(round(x+factor*gabor91[i][0]),round(y+factor*gabor91[i][1]))*gabor91[i][2]; - descriptor[17]+=this->image->getPixel(round(x+factor*gabor101[i][0]),round(y+factor*gabor101[i][1]))*gabor101[i][2]; - descriptor[18]+=this->image->getPixel(round(x+factor*gabor111[i][0]),round(y+factor*gabor111[i][1]))*gabor111[i][2]; - descriptor[19]+=this->image->getPixel(round(x+factor*gabor121[i][0]),round(y+factor*gabor121[i][1]))*gabor121[i][2]; + descriptor[16]+=this->image->getPixel(vigra::round(x+factor*gabor91[i][0]),vigra::round(y+factor*gabor91[i][1]))*gabor91[i][2]; + descriptor[17]+=this->image->getPixel(vigra::round(x+factor*gabor101[i][0]),vigra::round(y+factor*gabor101[i][1]))*gabor101[i][2]; + descriptor[18]+=this->image->getPixel(vigra::round(x+factor*gabor111[i][0]),vigra::round(y+factor*gabor111[i][1]))*gabor111[i][2]; + descriptor[19]+=this->image->getPixel(vigra::round(x+factor*gabor121[i][0]),vigra::round(y+factor*gabor121[i][1]))*gabor121[i][2]; - descriptor[20]+=this->image->getPixel(round(x+factor*gabor13[i][0]),round(y+factor*gabor131[i][1]))*gabor131[i][2]; - descriptor[21]+=this->image->getPixel(round(x+factor*gabor141[i][0]),round(y+factor*gabor141[i][1]))*gabor141[i][2]; - descriptor[22]+=this->image->getPixel(round(x+factor*gabor151[i][0]),round(y+factor*gabor151[i][1]))*gabor151[i][2]; - descriptor[23]+=this->image->getPixel(round(x+factor*gabor161[i][0]),round(y+factor*gabor161[i][1]))*gabor161[i][2]; + descriptor[20]+=this->image->getPixel(vigra::round(x+factor*gabor13[i][0]),vigra::round(y+factor*gabor131[i][1]))*gabor131[i][2]; + descriptor[21]+=this->image->getPixel(vigra::round(x+factor*gabor141[i][0]),vigra::round(y+factor*gabor141[i][1]))*gabor141[i][2]; + descriptor[22]+=this->image->getPixel(vigra::round(x+factor*gabor151[i][0]),vigra::round(y+factor*gabor151[i][1]))*gabor151[i][2]; + descriptor[23]+=this->image->getPixel(vigra::round(x+factor*gabor161[i][0]),vigra::round(y+factor*gabor161[i][1]))*gabor161[i][2]; } } @@ -594,7 +594,7 @@ int cnt=0; /*for(int i=2; i<=32;i*=2) { - add=round(maxima*i); + add=vigra::round(maxima*i); sum1=this->image->getRegionSum(x-add,y,x,y+add); sum2=-1*this->image->getRegionSum(x,y,x+add,y+add); sum3=this->image->getRegionSum(x,y-add,x+add,y); @@ -611,7 +611,7 @@ /*for(int i=2; i<=32;i*=2) { - add=round(maxima*i); + add=vigra::round(maxima*i); sum1=this->image->getRegionSum(x-add,y,x,y+add); sum2=-1*this->image->getRegionSum(x,y,x+add,y+add); sum3=this->image->getRegionSum(x,y-add,x+add,y); @@ -631,6 +631,7 @@ cout << "Creating descriptors..."<< endl; int regionSize; int i=0; + double orientation; this->interestPoints->resize(this->interestPoints->size()); cout << this->interestPoints->size()<<endl; vector<vector<int> >::iterator iter1 = this->interestPoints->begin(); @@ -642,7 +643,10 @@ descriptor.push_back(0); } - regionSize=round(40*this->_getMaxima(interestPoint[0], interestPoint[1])); + regionSize=vigra::round(15*this->_getMaxima(interestPoint[0], interestPoint[1])); + double b0,b1; + b0=6*this->_getMaxima(interestPoint[0], interestPoint[1]); + b1=11*this->_getMaxima(interestPoint[0], interestPoint[1]); int xStart=(interestPoint[0]-regionSize); int xEnd=(interestPoint[0] +regionSize); @@ -666,22 +670,45 @@ //cout << "Maxima:" << this->_getMaxima(interestPoint[0], interestPoint[1]) << endl; //cout << "Point:" << interestPoint[0] << "," << interestPoint[1]<< endl; + // + vector<int > iPointRelative = interestPoint; + iPointRelative[0]=regionSize; + iPointRelative[1]=regionSize; + // find edgels at scale of the interest point vigra::cannyEdgelList(srcIterRange( this->image->imgBW->upperLeft() + vigra::Diff2D(xStart, yStart), this->image->imgBW->upperLeft() + vigra::Diff2D(xEnd, yEnd)), - edgels, this->_getMaxima(interestPoint[0], interestPoint[1])); + edgels, this->_getMaxima(interestPoint[0], interestPoint[1]),iPointRelative); + /*this->image->_cannyEdgelList1(srcIterRange( this->image->imgBW->upperLeft() + vigra::Diff2D(xStart, yStart), + this->image->imgBW->upperLeft() + vigra::Diff2D(xEnd, yEnd)), + edgels, this->_getMaxima(interestPoint[0], interestPoint[1]), &interestPoint);*/ //cout << "Size:" << edgels.size() << endl; + //first edgel element holds orientation assignment for interest point vector<vigra::Edgel>::iterator iter2 = edgels.begin(); + vigra::Edgel edgePoint=*iter2; + iter2++; + //cout << "Orientation:" << edgePoint.orientation << ", strenght:" << edgePoint.strength << endl; + orientation = edgePoint.orientation; + if(orientation<0) orientation+=2*PI; + + double a0,a1,a2,a3; + a0=fmod(0+orientation,2*PI); + a1=fmod(PI/2+orientation,2*PI); + a2=fmod(PI+orientation,2*PI); + a3=fmod((3*PI)/2+orientation,2*PI); + + //int count =0; while( iter2 != edgels.end()) { //loop over every canny pixel - vigra::Edgel edgePoint=*iter2; - /*if(edgePoint.strength<5) { - iter2++; continue; - }*/ + edgePoint=*iter2; + + //TODO discard edgels that are not in circle + double distance=_euclidianDistance(interestPoint[0],interestPoint[1],edgePoint.x+xStart, edgePoint.y+yStart); + if(distance>regionSize) { + iter2++; continue; + } + //count++; //cout << edgePoint.x << ","<<edgePoint.y << "; orientation:"<<edgePoint.orientation<<",strength:"<<edgePoint.strength<<endl; - edgePoint.x+=xStart; - edgePoint.y+=yStart; - int sector; if(edgePoint.orientation<0) edgePoint.orientation+=2*PI; @@ -692,20 +719,22 @@ else if(edgePoint.orientation>=(PI/2) && edgePoint.orientation<PI) orientSector=1; else if(edgePoint.orientation>=PI && edgePoint.orientation<(3*PI/2)) orientSector=2; else if(edgePoint.orientation>=(3*PI/2)) orientSector=3; + else cerr<< "Orientation1:"<<edgePoint.orientation<<endl; + double result = atan2(regionSize-edgePoint.y,edgePoint.x-regionSize); + if(result<0.0) result+=2*PI; + //location is quantized into 9 bins - if(edgePoint.x<=interestPoint[0] && edgePoint.y>=interestPoint[1]) sector=1; - else if(edgePoint.x<=interestPoint[0] && edgePoint.y<=interestPoint[1]) sector=2; - else if(edgePoint.x>=interestPoint[0] && edgePoint.y<=interestPoint[1]) sector=3; - else if(edgePoint.x>=interestPoint[0] && edgePoint.y>=interestPoint[1]) sector=0; + if(result>=a0 && result<a1) sector=0; + else if(result>=a1 && result<a2) sector=1; + else if(result>=a2 && result<a3) sector=2; + else if(result>=a3 || result < a0) sector=3; + else cerr<< "Orientation2:"<<edgePoint.orientation<<endl; - double distance=_euclidianDistance(interestPoint[0],interestPoint[1],edgePoint.x,edgePoint.y); - distance = sqrt(distance); + if(distance<=b0) descriptor[orientSector*9 + 8]+=edgePoint.strength; + else if(distance>b0 && distance<=b1) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; + else if(distance>b1) descriptor[orientSector*9 + sector*2+1]+=edgePoint.strength; - if(distance<=0.78) descriptor[orientSector*9 + 8]+=edgePoint.strength; - else if(distance>0.78 && distance<=1.43) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; - else if(distance>1.43) descriptor[orientSector*9 + sector*2+1]+=edgePoint.strength; - /*double distance=_euclidianDistance(interestPoint[0],interestPoint[1],edgePoint.x,edgePoint.y); if(distance<=27) descriptor[orientSector*9 + 8]+=edgePoint.strength; else if(distance>27 && distance<=50) descriptor[orientSector*9 + sector*2+0]+=edgePoint.strength; @@ -714,7 +743,7 @@ iter2++; } - + //cout << "Size: "<<edgels.size()<< "; count: "<<count<<endl; this->descriptors.push_back(descriptor); iter1++; } @@ -794,3 +823,5 @@ } else return false; } + + Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/HessianDetector.cpp 2008-03-02 16:38:03 UTC (rev 2917) @@ -60,6 +60,7 @@ } else if(this->convolutionType==HD_SLIDING_WINDOW) { return this->_slidingWDetect(); } + return false; } bool HessianDetector::_slidingWDetect() { @@ -162,8 +163,8 @@ det = pixelSumXX*pixelSumYY-pow((double)pixelSumXY,2.0); //map coordinates on the scaled image onto coordinates on the original image - mappingX=round(i*pow(scale,s)); - mappingY=round(j*pow(scale,s)); + mappingX=vigra::round(i*pow(scale,s)); + mappingY=vigra::round(j*pow(scale,s)); if(det>determinants[mappingX][mappingY]) { //if(det>max) max=det; @@ -236,9 +237,10 @@ const int iMax=std::numeric_limits<int>::max(); - int offsetX=width*0.15; - int offsetY=height*0.15; + int offsetX=width*0.05; + int offsetY=height*0.05; + int xStart=offsetX; int yStart=offsetY; int xEnd=width-offsetX; @@ -267,8 +269,6 @@ * This can also be done in a loop. * */ - count++; - sum+=determinants[i][j]; if(determinants[i][j]>determinants[i-1][j-1] && determinants[i][j]>determinants[i-1][j] && @@ -278,10 +278,10 @@ determinants[i][j]>determinants[i+1][j-1] && determinants[i][j]>determinants[i+1][j] && determinants[i][j]>determinants[i+1][j+1] && - determinants[i][j]>25000) { + determinants[i][j]>300000) { //this->_insertToList(&i,&j); - /*cout << maximas[i][j]<<","<<determinants[i][j]<< ";"; - cout << i<<","<<j<< "\n";*/ + //cout << maximas[i][j]<<","<<determinants[i][j]<< ";"<<endl; + /*cout << i<<","<<j<< "\n";*/ vector<int> point; point.resize(2); @@ -289,6 +289,9 @@ point[1]=j; this->orderedList.push_back(point); + + count++; + sum+=determinants[i][j]; //it = orderedList.insert ( it , point); } @@ -297,10 +300,42 @@ //cout << "\n"; } cout << "Detected points:"<< this->orderedList.size() <<" "; - cout << "Average:"<< sum/count <<" "; + cout << "Average:"<< sum/count <<endl; + this->_cutPointList(sum/count,10000); return true; } +void HessianDetector::_cutPointList(double threshold, int nrPoints) { + if(this->orderedList.size()<nrPoints) return; + vector<vector<int> >::iterator iter1 = this->orderedList.begin(); + double avg=0; + int count=0; + while( iter1 != this->orderedList.end()) { //loop over every interest point + vector<int > interestPoint=*iter1; + + iter1++; + vector<int > interestPoint2=*iter1; + + //cout << this->determinants[interestPoint[0]][interestPoint[1]] << endl; + //cout << count << endl; + + + iter1--; + + if(this->determinants[interestPoint[0]][interestPoint[1]]<threshold) { + this->orderedList.erase(iter1); + } else { + avg+=this->determinants[interestPoint[0]][interestPoint[1]]; + iter1++; + } + count++; + } + + cout << "Number of points:"<< this->orderedList.size()<< endl; + + this->_cutPointList(avg/this->orderedList.size(), nrPoints); +} + void HessianDetector::_calculateMaxDet(int x, int y) { /** * Each octave has 4 kernel sizes. Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/HessianDetector.h 2008-03-02 16:38:03 UTC (rev 2917) @@ -74,6 +74,7 @@ int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); void _calculateMaxDet(int i, int j); //calculates scale-space maxima for pixel at coord i,j + void _cutPointList(double average, int nrPoints); double _getScale(int kernelSize); int _convolutePixel(int* coordX, int* coordY, int* kernelSize); Modified: gsoc07_featuredetection/MatchPoint.cpp =================================================================== --- gsoc07_featuredetection/MatchPoint.cpp 2008-03-01 17:09:54 UTC (rev 2916) +++ gsoc07_featuredetection/MatchPoint.cpp 2008-03-02 16:38:03 UTC (rev 2917) @@ -139,11 +139,11 @@ d1.setPoints(interestPoints1); //d.orientate(); d1.createDescriptors(); - //string name="test1.xml"; if(testFileOutput) { - if (verbose) cerr << "Generating output file for matlab test suite: " <<input1.append(".key") << endl; - d1.printDescriptors(input1.append(".key")); //for matlab test suite + string testOutputPath = input1.append(".key"); + if (verbose) cerr << "Generating output file for matlab test suite: " <<testOutputPath << endl; + d1.printDescriptors(testOutputPath); //for matlab test suite } d1.generateAutopanoXML(output); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |