From: <ste...@us...> - 2007-06-21 21:00:13
|
Revision: 2137 http://hugin.svn.sourceforge.net/hugin/?rev=2137&view=rev Author: stereo_sl Date: 2007-06-21 14:00:10 -0700 (Thu, 21 Jun 2007) Log Message: ----------- Initial upload. Current state: - detector without the scale-space - scale space is set up, but not yet fully implemented Added Paths: ----------- gsoc07_featuredetection/CMakeLists.txt gsoc07_featuredetection/COPYING gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.cpp gsoc07_featuredetection/Image.h gsoc07_featuredetection/Praprot.jpg gsoc07_featuredetection/README gsoc07_featuredetection/main.cpp Added: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt (rev 0) +++ gsoc07_featuredetection/CMakeLists.txt 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,15 @@ + +PROJECT(opencv) + +#if you don't want the full compiler output, remove the following line +SET(CMAKE_VERBOSE_MAKEFILE ON) + +#add definitions, compiler switches, etc. +ADD_DEFINITIONS(-Wall -O2) + +#list all source files here +ADD_EXECUTABLE(opencv main.cpp) + +#need to link to some other libraries ? just add them here +#TARGET_LINK_LIBRARIES(opencv png jpeg) + Added: gsoc07_featuredetection/COPYING =================================================================== --- gsoc07_featuredetection/COPYING (rev 0) +++ gsoc07_featuredetection/COPYING 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Added: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp (rev 0) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,170 @@ +/*************************************************************************** + * 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 <stdlib.h> +#include <math.h> +#include "HessianDetector.h" + +using namespace std; + +HessianDetector::HessianDetector(Image* i) { + this->image=i; + determinants.resize(this->image->getHeightBW()); + maximas.resize(this->image->getHeightBW()); + + //initialize the vectors + 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++) { + maximas[i][j] =0 ; + determinants[i][j]=0; + } + } +} + +bool HessianDetector::detect() { + + int height = this->image->getHeightBW(); + int width = this->image->getWidthBW(); + + int kernelX=5; + int kernelY=5; + int scale=1.2; + + //TODO: larger kernels for scale-space(see main.java) + + int gxx[][5]={ + 1, 29, 90, 29, 1, + 5, 133, 411, 133, 5, + -11, -329, -1013, -329, -11, + 5, 133, 411, 133, 5, + 1, 29, 90, 29, 1 + /*0,0,1,1,1,1,1,0,0, //box filters 9x9 + 0,0,1,1,1,1,1,0,0, + 0,0,1,1,1,1,1,0,0, + 0,0,-2,-2,-2,-2,-2,0,0, + 0,0,-2,-2,-2,-2,-2,0,0, + 0,0,-2,-2,-2,-2,-2,0,0, + 0,0,1,1,1,1,1,0,0, + 0,0,1,1,1,1,1,0,0, + 0,0,1,1,1,1,1,0,0*/ + }; + + int gyy[][5]={ + 1, 5, -11, 5, 1, + 29, 133, -329, 133, 29, + 90, 411, -1013, 411, 90, + 29, 133, -329, 133, 29, + 1, 5, -11, 5, 1}; + + int gxy[][5]={ + 1, 15, 0, -15, -1, + 15, 214, 0, -214, -15, + 0, 0, 0, 0, 0, + -15, -214, 0, 214, 15, + -1, -15, 0, 15, 1 + /*0,0,0,0,0,0,0,0,0, + 0,1,1,1,0,-1,-1,-1,0, + 0,1,1,1,0,-1,-1,-1,0, + 0,1,1,1,0,-1,-1,-1,0, + 0,0,0,0,0,0,0,0,0, + 0,-1,-1,-1,0,1,1,1,0, + 0,-1,-1,-1,0,1,1,1,0, + 0,-1,-1,-1,0,1,1,1,0, + 0,0,0,0,0,0,0,0,0*/ + }; + + int offsetX=floor(kernelX/2); + int offsetY=floor(kernelY/2); + int xStart=0; + int yStart=0; + double pixelSumYY=0; + double pixelSumXX=0; + double pixelSumXY=0; + bool outOfRange=false; + int tmpX=0; + int tmpY=0; + int val; + + double det=0; + + + for(int s=1; s<2;s+=1.0) { //scale-space loop + cout << s << "\n"; + + for(int i=0;i<height;i++) { + for(int j=0; j<width;j++) { + //cout << j <<" "; + pixelSumYY=0; + pixelSumXX=0; + pixelSumXY=0; + xStart=i-offsetX; + outOfRange=false; + yStart=j-offsetY; + for(int k=0;k<kernelX;k++) { + tmpX=xStart+k; + if(tmpX<0) tmpX=height+tmpX; + if(tmpX>=height) tmpX=tmpX-height; + + for(int l=0;l<kernelY;l++) { + tmpY=yStart+l; + + if(tmpY<0) tmpY=width+tmpY; + + if(tmpY>=height) tmpY=tmpY-height; + //cout << "(" << tmpX<< "," <<tmpY <<") "; + val=image->getPixel(tmpX,tmpY); + + pixelSumYY+=0.001*gyy[k][l]*val; + pixelSumXX+=0.001*gxx[k][l]*val; + pixelSumXY+=0.001*gxy[k][l]*val; + //cout << " "<< pixelSumXX; + //} + } + } + //cout << "\n\n"; + + det = pixelSumXX*pixelSumYY-pow((pixelSumXY),2); + + if(det>determinants[i][j]) { + determinants[i][j]=det; + maximas[i][j]=s; + } + } + // cout << "\n"; + } + } //scale-space + + //TODO: + for(int i=0;i<image->getHeight();i++) { + for(int j=0; j<image->getWidth();j++) { + //cout << "("<<maximas[i][j]<<","<<determinants[i][j] << ")" <<" "; + if(determinants[i][j]>2000) { + image->drawCircle(j,i,(int)5*maximas[i][j]); + //cout << (int)10*maximas[i][j]<<"\n"; + } + } + //cout << "\n"; + } + image->show(); + return true; +} Added: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h (rev 0) +++ gsoc07_featuredetection/HessianDetector.h 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,62 @@ +/*************************************************************************** + * 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 HESSIANDETECTOR_H_ +#define HESSIANDETECTOR_H_ +#include "Image.h" + +using namespace std; + + +class HessianDetector + { + + public: + //scale level + HessianDetector(Image* i); + + bool detect(); + /*void convolute(int* kernel,int dim1, int dim2,double scale); + int getPixel(int x,int y); + int getWidth(); + int getWidthBW(); + int getHeight(); + int getHeightBW(); + void scale(int factor); + Image* getCopy(); + void drawCircle(int x,int y, int radius);*/ + + /*bool open(); + void show();*/ + /* void indexByName(QString iName); + void indexByImage(QImage im); + int diff(Image *sampleImage);*/ + + +/* private slots: +*/ + + private: + Image* image; + vector<vector<double> > determinants; //holds the values of the hessian determinant for each pixel + vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum + }; + +#endif /*HESSIANDETECTOR_H_*/ Added: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp (rev 0) +++ gsoc07_featuredetection/Image.cpp 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,149 @@ +/*************************************************************************** + * 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" +#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; + +Image::Image(string p) { +this->path=p; +} + +bool Image::open() { + + this->img=0; + this->img=cvLoadImage(this->path.c_str(),1); + + if(!img) return false; + else { + this->imgBW=cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1); + if(!imgBW) return false; + + cvCvtColor(img,imgBW,CV_BGR2GRAY); // cimg -> gimg + if(!imgBW) return false; + else return true; + + } +} +void Image::convolute(int* kernel,int dim1, int dim2,double scale) { + //TODO: general convolution is needed for smoothing in scale-space representation + 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"; + } + cout << "\nMax:"<< max; +} +int Image::getPixel(int x,int y) { + //cout << "Get pixel x:" << x << ",y:" << y << "\n"; + CvScalar s=cvGet2D(imgBW,x,y); + // cout << "Value:"<< s.val[0] << "\n"; + return s.val[0]; +} +int Image::getWidth() { + return this->img->width; +} +int Image::getWidthBW() { + return this->imgBW->width; +} +int Image::getHeight() { + return this->img->height; +} +int Image::getHeightBW() { + return this->imgBW->height; +} +Image* Image::getCopy() { + return new Image(""); +} +void Image::scale(int factor) { +//#ifdef USE_OPENCV + IplImage *resized = cvCreateImage(cvSize((int)this->getWidth()/factor,(int)this->getHeight()/factor), imgBW->depth ,imgBW->nChannels); + cvResize(resized, imgBW); + this->imgBW=resized; +//#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" ); + //cvReleaseImage( &img ); +} +void Image::drawCircle(int x,int y, int radius) { + cvCircle(this->img, cvPoint(x,y), radius, cvScalar(0,255,0), 1); +} +void Image::smooth() { + //TODO: create a gaussian mask and call the function convolute +} Added: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h (rev 0) +++ gsoc07_featuredetection/Image.h 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,68 @@ +/*************************************************************************** + * 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 +#include <string> +#include <stdio.h> +#include <iostream> +#include <stdlib.h> +#include <vector.h> +#include <cv.h> +/*#include "vigra/stdimage.hxx" +#include "vigra/impex.hxx"*/ + +using namespace std; + + +class Image + { + + public: + Image(string p); + void convolute(int* kernel,int dim1, int dim2,double scale); + int getPixel(int x,int y); + int getWidth(); + int getWidthBW(); + int getHeight(); + int getHeightBW(); + void scale(int factor); + Image* getCopy(); + void drawCircle(int x,int y, int radius); + void smooth(); + + bool open(); + void show(); + +/* private slots: +*/ + + private: + /** + * Holds the convolution of the image. + */ + vector<vector<int> > convolution; + string path; + IplImage* img; + IplImage* imgBW; + + }; + + +#endif // IMAGE_H_INCLUDED Added: gsoc07_featuredetection/Praprot.jpg =================================================================== (Binary files differ) Property changes on: gsoc07_featuredetection/Praprot.jpg ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: gsoc07_featuredetection/README =================================================================== --- gsoc07_featuredetection/README (rev 0) +++ gsoc07_featuredetection/README 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1 @@ + Added: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp (rev 0) +++ gsoc07_featuredetection/main.cpp 2007-06-21 21:00:10 UTC (rev 2137) @@ -0,0 +1,61 @@ +/*************************************************************************** + * 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 1 +//#define USE_VIGRA 1 + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <iostream> +#include <stdlib.h> + +#include <string> +#include "Image.h" +#include "HessianDetector.h" + +using namespace std; + +int main(int argc, char *argv[]) +{ + string mystr; + if(argc!=1) { + cout << "Usage: ./main path_to_image" << "\n"; + return 0; + } + mystr="Praprot.jpg"; + + Image im(mystr); + if(im.open()) { + cout << "Image opened!!!" << "\n"; + } else { + cout<< "Error!!!"<<"\n"; + return 0; + } + + HessianDetector hd(&im); + if(hd.detect()) { + cout << "Detection of points failed!"; + return 1; + } + return EXIT_SUCCESS; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-06-21 21:11:33
|
Revision: 2138 http://hugin.svn.sourceforge.net/hugin/?rev=2138&view=rev Author: stereo_sl Date: 2007-06-21 14:11:32 -0700 (Thu, 21 Jun 2007) Log Message: ----------- file for calculating the gaussian second order derivative kernels Added Paths: ----------- gsoc07_featuredetection/java/ gsoc07_featuredetection/java/gauss/ gsoc07_featuredetection/java/gauss/Main.java Added: gsoc07_featuredetection/java/gauss/Main.java =================================================================== --- gsoc07_featuredetection/java/gauss/Main.java (rev 0) +++ gsoc07_featuredetection/java/gauss/Main.java 2007-06-21 21:11:32 UTC (rev 2138) @@ -0,0 +1,53 @@ +/* + * Main.java + * + * To change this template, choose Tools | Template Manager + * and open the template in the editor. + */ +package gauss; + +import java.lang.Math; + + + +/** + * + * @author zoran + */ +public class Main { + + + + + /** Creates a new instance of Main */ + public Main() { + + + } + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + // TODO code application logic here + //stuff for calculating the second order derivatives gaussian kernels + double dev=1.2; //standard deviation + System.out.println("gxx"); + for(double i=-4.32;i<=4.32;i+=2.16) { + //for(double i=-3.6;i<=3.6;i+=1.8) { + for(double j=-4.32;j<=4.32;j+=2.16) { + double d=((Math.pow(i,2)*Math.pow(2*Math.PI*Math.pow(dev,6),-1))*Math.exp(-(Math.pow(i,2)+Math.pow(j,2))/(2*Math.pow(dev,2))))-(Math.pow(2*Math.PI*Math.pow(dev,4),-1)*Math.exp(-(Math.pow(i,2)+Math.pow(j,2))/(2*Math.pow(dev,2)))); + System.out.print(Math.round(1.3197*(10000*d))+" "); + } + System.out.println(); + } + System.out.println("gxy"); + for(double i=-3.6;i<=3.6;i+=1.8) { + for(double j=-3.6;j<=3.6;j+=1.8) { + double d=i*j*Math.pow(Math.PI*2*Math.pow(dev,6),-1)*Math.exp(-(Math.pow(i,2)+Math.pow(j,2))/(2*Math.pow(dev,2))); + System.out.print(Math.round(1.173*(10000*d))+" "); + } + System.out.println(); + } + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-05 20:51:01
|
Revision: 2230 http://hugin.svn.sourceforge.net/hugin/?rev=2230&view=rev Author: stereo_sl Date: 2007-07-05 13:50:56 -0700 (Thu, 05 Jul 2007) Log Message: ----------- - added the support for the number of points detected - new function for convolution of a pixel with box filters Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-05 11:30:47 UTC (rev 2229) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-05 20:50:56 UTC (rev 2230) @@ -27,18 +27,30 @@ using namespace std; -HessianDetector::HessianDetector(Image* i) { +HessianDetector::HessianDetector(Image* i, int nrPoints, CONVOLUTION_TYPE type) { this->image=i; + this->nrPoints=nrPoints; + this->convolutionType = type; determinants.resize(this->image->getHeightBW()); maximas.resize(this->image->getHeightBW()); - m.resize(this->image->getHeightBW()); - a.resize(this->image->getHeightBW()); + /*vector<int> init; + init.resize(3); + init[0]=0; + init[1]=0; + init[2]=0; + this->orderedList(nrPoints);*/ + this->orderedList; //initialize the vectors for(int i=0;i<this->image->getHeightBW();i++) { + /*if(i<nrPoints) { + orderedList[i].resize(3); + orderedList[i][0]=0; //x pixel value + orderedList[i][1]=0; //y pixel value + orderedList[i][2]=0; //det pixel value + }*/ maximas[i].resize(this->image->getWidthBW()); - m[i].resize(this->image->getWidthBW()); - a[i].resize(this->image->getWidthBW()); + determinants[i].resize(this->image->getWidthBW()); for(int j=0; j<this->image->getWidthBW();j++) { maximas[i][j] =0 ; @@ -49,11 +61,10 @@ bool HessianDetector::detect() { - int height = this->image->getHeightBW(); int width = this->image->getWidthBW(); - int kernelX=9; + /*int kernelX=9; int kernelY=9; double scale=1.2; @@ -62,7 +73,7 @@ 5, 133, 411, 133, 5, -11, -329, -1013, -329, -11, 5, 133, 411, 133, 5, - 1, 29, 90, 29, 1*/ + 1, 29, 90, 29, 1 1, 7, 29, 68, 90, 68, 29, 7, 1, //9x9 gauss kernels 4, 26, 106, 247, 327, 247, 106, 26, 4, 5, 33, 133, 310, 411, 310, 133, 33, 5, @@ -80,7 +91,7 @@ 0,0,-2,-2,-2,-2,-2,0,0, 0,0,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,0,0, - 0,0,1,1,1,1,1,0,0*/ + 0,0,1,1,1,1,1,0,0 }; int gyy[][9]={ @@ -88,7 +99,7 @@ 29, 133, -329, 133, 29, 90, 411, -1013, 411, 90, 29, 133, -329, 133, 29, - 1, 5, -11, 5, 1*/ + 1, 5, -11, 5, 1 1, 4, 5, -4, -11, -4, 5, 4, 1, 7, 26, 33, -27, -81, -27, 33, 26, 7, 29, 106, 133, -109, -329, -109, 133, 106, 29, @@ -106,7 +117,7 @@ 1,1,1,-2,-2,-2,1,1,1, 1,1,1,-2,-2,-2,1,1,1, 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0*/ + 0,0,0,0,0,0,0,0,0 }; int gxy[][9]={ @@ -114,7 +125,7 @@ 15, 214, 0, -214, -15, 0, 0, 0, 0, 0, -15, -214, 0, 214, 15, - -1, -15, 0, 15, 1*/ + -1, -15, 0, 15, 1 1, 5, 15, 17, 0, -17, -15, -5, -1, 5, 29, 78, 91, 0, -91, -78, -29, -5, 15, 78, 214, 248, 0, -248, -214, -78, -15, @@ -132,11 +143,11 @@ 0,-1,-1,-1,0,1,1,1,0, 0,-1,-1,-1,0,1,1,1,0, 0,-1,-1,-1,0,1,1,1,0, - 0,0,0,0,0,0,0,0,0*/ - }; + 0,0,0,0,0,0,0,0,0 + };*/ - int offsetX=floor(kernelX/2); - int offsetY=floor(kernelY/2); + /* int offsetX=floor(kernelX/2); + int offsetY=floor(kernelY/2);*/ int pixelSumYY; int pixelSumXX; @@ -163,97 +174,37 @@ for(int i=15;i<(height-13);i++) { for(int j=15; j<(width-13);j++) { - pixelSumYY=0; - pixelSumXX=0; - pixelSumXY=0; + /*xStart=i-offsetX; yStart=j-offsetY;*/ + det=this->_convolutePixel(i,j,9); - //9x9 kernel - pixelSumXX=1*this->image->getRegionSum(i-4,j-2,i-2,j+2); - pixelSumXX+=1*this->image->getRegionSum(i+2,j-2,i+4,j+2); - pixelSumXX+=-2*this->image->getRegionSum(i-1,j-2,i+1,j+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+=1*this->image->getRegionSum(i-3,j-3,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+3,j+3); - - pixelSumYY=1*this->image->getRegionSum(i-2,j-4,i+2,j-2); - pixelSumYY+=1*this->image->getRegionSum(i-2,j+2,i+2,j+4); - pixelSumYY+=-2*this->image->getRegionSum(i-2,j-1,i+2,j+1); - - //determinant of the Hessian Matrix - det=getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY); - if(det>max) max=det; determinants[i][j]=det; maximas[i][j]=9; - //15x15 kernel - pixelSumXX=1*this->image->getRegionSum(i-7,j-4,i-3,j+4); - pixelSumXX+=1*this->image->getRegionSum(i+3,j-4,i+7,j+4); - pixelSumXX+=-2*this->image->getRegionSum(i-2,j-4,i+2,j+4); + /*det=this->_convolutePixel(i,j,15); - 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+=1*this->image->getRegionSum(i-5,j-5,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+5,j+5); - - pixelSumYY=1*this->image->getRegionSum(i-4,j-7,i+4,j-3); - pixelSumYY+=1*this->image->getRegionSum(i-4,j+3,i+4,j+7); - pixelSumYY+=-2*this->image->getRegionSum(i-4,j-2,i+4,j+2); - - det=getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/2.7778; if(det>max) max=det; if(det>determinants[i][j]) { determinants[i][j]=det; maximas[i][j]=15; } - //21x21 kernel - pixelSumXX=1*this->image->getRegionSum(i-10,j-6,i-4,j+6); - pixelSumXX+=1*this->image->getRegionSum(i+4,j-6,i+10,j+6); - pixelSumXX+=-2*this->image->getRegionSum(i-3,j-6,i+3,j+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+=1*this->image->getRegionSum(i-7,j-7,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+7,j+7); - - pixelSumYY=1*this->image->getRegionSum(i-6,j-10,i+6,j-4); - pixelSumYY+=1*this->image->getRegionSum(i-6,j+4,i+6,j+10); - pixelSumYY+=-2*this->image->getRegionSum(i-6,j-3,i+6,j+3); - - det=getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/5.4444; + det=this->_convolutePixel(i,j,21); if(det>max) max=det; if(det>determinants[i][j]) { determinants[i][j]=det; maximas[i][j]=21; } - - //27x27 kernel - pixelSumXX=1*this->image->getRegionSum(i-13,j-7,i-5,j+7); - pixelSumXX+=1*this->image->getRegionSum(i+5,j-7,i+13,j+7); - pixelSumXX+=-2*this->image->getRegionSum(i-4,j-7,i+4,j+7); - - pixelSumXY=-1*this->image->getRegionSum(i-9,j+1,i-1,j+9); - pixelSumXY+=-1*this->image->getRegionSum(i+1,j-9,i+7,j-1); - pixelSumXY+=1*this->image->getRegionSum(i-9,j-9,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+9,j+9); - - pixelSumYY=1*this->image->getRegionSum(i-7,j-13,i+7,j-5); - pixelSumYY+=1*this->image->getRegionSum(i-7,j+5,i+7,j+13); - pixelSumYY+=-2*this->image->getRegionSum(i-7,j-4,i+7,j+4); - - det=getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/9; + det=this->_convolutePixel(i,j,27); if(det>max) max=det; if(det>determinants[i][j]) { determinants[i][j]=det; maximas[i][j]=27; - } + }*/ } //cout << "\n"; @@ -264,9 +215,6 @@ } //scale-space*/ //TODO: - double p; - double q; - double deg; int tmp; int xStart=0; @@ -274,7 +222,7 @@ int yStart=0; int yEnd=0; - int threshold=0.15*max; + //int threshold=0.15*max; //loop over each pixel and calculate the magnitutes and angles of gradient for(int i=0;i<image->getHeight();i++) { if(i>=(image->getHeight()-1)) { @@ -307,8 +255,7 @@ * */ - if(determinants[i][j] > threshold && - determinants[i][j]>determinants[xStart][yStart] && + if(determinants[i][j]>determinants[xStart][yStart] && determinants[i][j]>determinants[xStart][j] && determinants[i][j]>determinants[xStart][yEnd] && determinants[i][j]>determinants[i][yStart] && @@ -316,9 +263,11 @@ determinants[i][j]>determinants[xEnd][yStart] && determinants[i][j]>determinants[xEnd][j] && determinants[i][j]>determinants[xEnd][yEnd] ) { - image->drawCircle(j,i,maximas[i][j]/2); + this->_insertToList(i,j,determinants[i][j]); + + /*image->drawCircle(j,i,maximas[i][j]/2); image->drawCircle(j,i,1); - cout << maximas[i][j] << " "; + cout << maximas[i][j] << " ";*/ } /*p=(determinants[i][yStart]-determinants[i][j]+determinants[xStart][yStart]-determinants[xStart][j])/2; q=(determinants[i][j]-determinants[xStart][j]+determinants[i][yStart]-determinants[xStart][yStart])/2; @@ -357,7 +306,8 @@ //cout << "\n"; } cout << "\n"; - image->show(); + + /*int threshold=0.15*max; for(int i=3;i<(image->getHeight()-1);i++) { @@ -400,6 +350,140 @@ return true; } -int HessianDetector::getHessianDeterminant(int pixelSumXX, int pixelSumXY, int pixelSumYY) { +int HessianDetector::_getHessianDeterminant(int pixelSumXX, int pixelSumXY, int pixelSumYY) { return pixelSumXX*pixelSumYY-pow((0.9*pixelSumXY),2); } + +int HessianDetector::_convolutePixel(int i, int j, int kernelSize) { +//for box filters only + int pixelSumYY=0; + int pixelSumXX=0; + int pixelSumXY=0; + int det; + switch(kernelSize) { + case 9: + //9x9 kernel + pixelSumXX=1*this->image->getRegionSum(i-4,j-2,i-2,j+2); + pixelSumXX+=1*this->image->getRegionSum(i+2,j-2,i+4,j+2); + pixelSumXX+=-2*this->image->getRegionSum(i-1,j-2,i+1,j+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+=1*this->image->getRegionSum(i-3,j-3,i-1,j-1); + pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+3,j+3); + + pixelSumYY=1*this->image->getRegionSum(i-2,j-4,i+2,j-2); + pixelSumYY+=1*this->image->getRegionSum(i-2,j+2,i+2,j+4); + pixelSumYY+=-2*this->image->getRegionSum(i-2,j-1,i+2,j+1); + + //determinant of the Hessian Matrix + det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY); + break; + case 15: + //15x15 kernel + pixelSumXX=1*this->image->getRegionSum(i-7,j-4,i-3,j+4); + pixelSumXX+=1*this->image->getRegionSum(i+3,j-4,i+7,j+4); + pixelSumXX+=-2*this->image->getRegionSum(i-2,j-4,i+2,j+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+=1*this->image->getRegionSum(i-5,j-5,i-1,j-1); + pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+5,j+5); + + pixelSumYY=1*this->image->getRegionSum(i-4,j-7,i+4,j-3); + pixelSumYY+=1*this->image->getRegionSum(i-4,j+3,i+4,j+7); + pixelSumYY+=-2*this->image->getRegionSum(i-4,j-2,i+4,j+2); + + det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/2.7778; + break; + case 21: + //21x21 kernel + pixelSumXX=1*this->image->getRegionSum(i-10,j-6,i-4,j+6); + pixelSumXX+=1*this->image->getRegionSum(i+4,j-6,i+10,j+6); + pixelSumXX+=-2*this->image->getRegionSum(i-3,j-6,i+3,j+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+=1*this->image->getRegionSum(i-7,j-7,i-1,j-1); + pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+7,j+7); + + pixelSumYY=1*this->image->getRegionSum(i-6,j-10,i+6,j-4); + pixelSumYY+=1*this->image->getRegionSum(i-6,j+4,i+6,j+10); + pixelSumYY+=-2*this->image->getRegionSum(i-6,j-3,i+6,j+3); + + det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/5.4444; + break; + case 27: + //27x27 kernel + pixelSumXX=1*this->image->getRegionSum(i-13,j-7,i-5,j+7); + pixelSumXX+=1*this->image->getRegionSum(i+5,j-7,i+13,j+7); + pixelSumXX+=-2*this->image->getRegionSum(i-4,j-7,i+4,j+7); + + pixelSumXY=-1*this->image->getRegionSum(i-9,j+1,i-1,j+9); + pixelSumXY+=-1*this->image->getRegionSum(i+1,j-9,i+7,j-1); + pixelSumXY+=1*this->image->getRegionSum(i-9,j-9,i-1,j-1); + pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+9,j+9); + + pixelSumYY=1*this->image->getRegionSum(i-7,j-13,i+7,j-5); + pixelSumYY+=1*this->image->getRegionSum(i-7,j+5,i+7,j+13); + pixelSumYY+=-2*this->image->getRegionSum(i-7,j-4,i+7,j+4); + + det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/9; + } + return det; +} +void HessianDetector::_insertToList(int x, int y, int det) { + vector<int> point; + point.resize(2); + point[0]=x; + point[1]=y; + if(this->orderedList.size()>=this->nrPoints) { + vector<int> tmp=this->orderedList.back(); + if(det<=determinants[tmp[0]][tmp[1]]) return; + + tmp = this->orderedList.front(); + if(det>=determinants[tmp[0]][tmp[1]]) { + this->orderedList.insert(this->orderedList.begin(),point); + this->orderedList.pop_back(); + return; + } + this->orderedList.pop_back(); + } else { + if(this->orderedList.size()==0) { + this->orderedList.push_back(point); + return; + } + vector<int> tmp=this->orderedList.back(); + if(det<=determinants[tmp[0]][tmp[1]]) { + this->orderedList.push_back(point); + return; + } + tmp = this->orderedList.front(); + if(det>=determinants[tmp[0]][tmp[1]]) { + orderedList.insert(orderedList.begin(),point); + return; + } + } + vector<vector<int> >::iterator iter1 = orderedList.begin(); + while( iter1 != orderedList.end()) { + vector<int > tmp=*iter1; + if(determinants[tmp[0]][tmp[1]]<=det) { + orderedList.insert(iter1,point); + return; + } + iter1++; + } +} +void HessianDetector::printPoints() { + vector<vector<int> >::iterator iter1 = orderedList.begin(); + iter1 = orderedList.begin(); + 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]]/2); + this->image->drawCircle(tmp2[1],tmp2[0],1); + iter1++; + } + this->image->show(); + //cout << "\n"; +} Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-07-05 11:30:47 UTC (rev 2229) +++ gsoc07_featuredetection/HessianDetector.h 2007-07-05 20:50:56 UTC (rev 2230) @@ -24,15 +24,19 @@ using namespace std; +#define CONVOLUTION_TYPE int +#define HD_SLIDING_WINDOW 2 +#define HD_BOX_FILTERS 1 class HessianDetector { public: - //scale level - HessianDetector(Image* i); + HessianDetector(Image* i, int nrPoints=100, CONVOLUTION_TYPE type=HD_BOX_FILTERS); bool detect(); + void _insertToList(int x, int y, int det); + void printPoints(); /*void convolute(int* kernel,int dim1, int dim2,double scale); int getPixel(int x,int y); int getWidth(); @@ -43,23 +47,20 @@ Image* getCopy(); void drawCircle(int x,int y, int radius);*/ - /*bool open(); - void show();*/ - /* void indexByName(QString iName); - void indexByImage(QImage im); - int diff(Image *sampleImage);*/ - - /* private slots: */ private: Image* image; + int nrPoints; + CONVOLUTION_TYPE convolutionType; vector<vector<int> > determinants; //holds the values of the hessian determinant for each pixel vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum - vector<vector<double> > m; - vector<vector<int> > a; - int getHessianDeterminant(int pixelSumXX, int pixelSumXY, int pixelSumYY); + vector<vector<int> > orderedList; //first n pixels the largest determinant values + + + int _getHessianDeterminant(int pixelSumXX, int pixelSumXY, int pixelSumYY); + int _convolutePixel(int coordX, int coordY, int kernelSize); }; #endif /*HESSIANDETECTOR_H_*/ Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-07-05 11:30:47 UTC (rev 2229) +++ gsoc07_featuredetection/Image.cpp 2007-07-05 20:50:56 UTC (rev 2230) @@ -105,9 +105,7 @@ } } int Image::getPixel(int x,int y) { - //cout << "Get pixel x:" << x << ",y:" << y << "\n"; CvScalar s=cvGet2D(imgBW,x,y); - // cout << "Value:"<< s.val[0] << "\n"; return s.val[0]; } int Image::getWidth() { @@ -130,7 +128,6 @@ IplImage *resized= cvCreateImage(cvSize(round(this->getWidthBW()/factor),round(this->getHeightBW()/factor)), imgBW->depth ,imgBW->nChannels); cvResize(imgBW,resized); this->imgBW=resized; - CvScalar s=cvGet2D(imgBW,100,100); //#endif } void Image::show() { @@ -167,14 +164,14 @@ return this->integral[x][y]; } int Image::getRegionSum(int x1, int y1, int x2, int y2) { - if(x1<=0) x1=1; + /*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(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]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-08 22:12:07
|
Revision: 2247 http://hugin.svn.sourceforge.net/hugin/?rev=2247&view=rev Author: stereo_sl Date: 2007-07-08 15:11:59 -0700 (Sun, 08 Jul 2007) Log Message: ----------- - code optimization(used pointers wherever possible) - added file for testing - added 11x11 and 17x17 box filters Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.cpp gsoc07_featuredetection/Image.h gsoc07_featuredetection/main.cpp Added Paths: ----------- gsoc07_featuredetection/test/ gsoc07_featuredetection/test/README gsoc07_featuredetection/test/main.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-08 18:03:45 UTC (rev 2246) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-08 22:11:59 UTC (rev 2247) @@ -28,18 +28,13 @@ using namespace std; HessianDetector::HessianDetector(Image* i, int nrPoints, CONVOLUTION_TYPE type) { + //cout << "constructor\n"; this->image=i; this->nrPoints=nrPoints; this->convolutionType = type; determinants.resize(this->image->getHeightBW()); maximas.resize(this->image->getHeightBW()); - /*vector<int> init; - init.resize(3); - init[0]=0; - init[1]=0; - init[2]=0; - this->orderedList(nrPoints);*/ this->orderedList; //initialize the vectors for(int i=0;i<this->image->getHeightBW();i++) { @@ -54,26 +49,28 @@ determinants[i].resize(this->image->getWidthBW()); for(int j=0; j<this->image->getWidthBW();j++) { maximas[i][j] =0 ; - determinants[i][j]=0; + determinants[i][j]=-99999; } } } -bool HessianDetector::detect() { +bool HessianDetector::detect(int kernelSize) { + if(this->convolutionType==HD_BOX_FILTERS) { + return this->_boxFilterDetect(kernelSize); + } else if(this->convolutionType==HD_SLIDING_WINDOW) { + return this->_slidingWDetect(kernelSize); + } +} +bool HessianDetector::_slidingWDetect(int kernelSize) { int height = this->image->getHeightBW(); int width = this->image->getWidthBW(); - /*int kernelX=9; + int kernelX=9; int kernelY=9; double scale=1.2; int gxx[][9]={ - /*1, 29, 90, 29, 1, - 5, 133, 411, 133, 5, - -11, -329, -1013, -329, -11, - 5, 133, 411, 133, 5, - 1, 29, 90, 29, 1 1, 7, 29, 68, 90, 68, 29, 7, 1, //9x9 gauss kernels 4, 26, 106, 247, 327, 247, 106, 26, 4, 5, 33, 133, 310, 411, 310, 133, 33, 5, @@ -83,23 +80,9 @@ 5, 33, 133, 310, 411, 310, 133, 33, 5, 4, 26, 106, 247, 327, 247, 106, 26, 4, 1, 7, 29, 68, 90, 68, 29, 7, 1 - /*0,0,1,1,1,1,1,0,0, //box filters 9x9 - 0,0,1,1,1,1,1,0,0, - 0,0,1,1,1,1,1,0,0, - 0,0,-2,-2,-2,-2,-2,0,0, - 0,0,-2,-2,-2,-2,-2,0,0, - 0,0,-2,-2,-2,-2,-2,0,0, - 0,0,1,1,1,1,1,0,0, - 0,0,1,1,1,1,1,0,0, - 0,0,1,1,1,1,1,0,0 }; int gyy[][9]={ - /*1, 5, -11, 5, 1, - 29, 133, -329, 133, 29, - 90, 411, -1013, 411, 90, - 29, 133, -329, 133, 29, - 1, 5, -11, 5, 1 1, 4, 5, -4, -11, -4, 5, 4, 1, 7, 26, 33, -27, -81, -27, 33, 26, 7, 29, 106, 133, -109, -329, -109, 133, 106, 29, @@ -109,23 +92,9 @@ 29, 106, 133, -109, -329, -109, 133, 106, 29, 7, 26, 33, -27, -81, -27, 33, 26, 7, 1, 4, 5, -4, -11, -4, 5, 4, 1 - /*0,0,0,0,0,0,0,0,0, //box filters 9x9 - 0,0,0,0,0,0,0,0,0, - 1,1,1,-2,-2,-2,1,1,1, - 1,1,1,-2,-2,-2,1,1,1, - 1,1,1,-2,-2,-2,1,1,1, - 1,1,1,-2,-2,-2,1,1,1, - 1,1,1,-2,-2,-2,1,1,1, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0 }; int gxy[][9]={ - /*1, 15, 0, -15, -1, - 15, 214, 0, -214, -15, - 0, 0, 0, 0, 0, - -15, -214, 0, 214, 15, - -1, -15, 0, 15, 1 1, 5, 15, 17, 0, -17, -15, -5, -1, 5, 29, 78, 91, 0, -91, -78, -29, -5, 15, 78, 214, 248, 0, -248, -214, -78, -15, @@ -135,20 +104,12 @@ -15, -78, -214, -248, 0, 248, 214, 78, 15, -5, -29, -78, -91, 0, 91, 78, 29, 5, -1, -5, -15, -17, 0, 17, 15, 5, 1 - /*0,0,0,0,0,0,0,0,0, - 0,1,1,1,0,-1,-1,-1,0, - 0,1,1,1,0,-1,-1,-1,0, - 0,1,1,1,0,-1,-1,-1,0, - 0,0,0,0,0,0,0,0,0, - 0,-1,-1,-1,0,1,1,1,0, - 0,-1,-1,-1,0,1,1,1,0, - 0,-1,-1,-1,0,1,1,1,0, - 0,0,0,0,0,0,0,0,0 - };*/ + }; - /* int offsetX=floor(kernelX/2); - int offsetY=floor(kernelY/2);*/ - + int offsetX=floor(kernelX/2); + int offsetY=floor(kernelY/2); + int xStart=0; + int yStart=0; int pixelSumYY; int pixelSumXX; int pixelSumXY; @@ -156,74 +117,67 @@ int tmpX=0; int tmpY=0; int val; - /*double mappingX; - double mappingY;*/ + int mappingX; + int mappingY; int det; - int max=0; - image->integrate(); //re-calculate the integral image - /*for(int s=0; s<6;s+=1.0) { //scale-space loop - cout << s << "\n"; - image->integrate(); //re-calculate the integral image + + for(int s=0; s<6;s+=1.0) { //scale-space loop + //cout << s << "\n"; height=image->getHeightBW(); - width=image->getWidthBW();*/ - cout << height << "," << width << " \n"; - cout << " "; + width=image->getWidthBW(); + /*cout << height << "," << width << " \n"; + cout << " ";*/ + for(int i=0;i<height;i++) { + for(int j=0; j<width;j++) { + pixelSumYY=0; + pixelSumXX=0; + pixelSumXY=0; + xStart=i-offsetX; + yStart=j-offsetY; - for(int i=15;i<(height-13);i++) { - for(int j=15; j<(width-13);j++) { + for(int k=0;k<kernelX;k++) { + tmpX=xStart+k; + if(tmpX<0) tmpX=height+tmpX; + if(tmpX>=height) tmpX=tmpX-height; + for(int l=0;l<kernelY;l++) { + tmpY=yStart+l; - /*xStart=i-offsetX; - yStart=j-offsetY;*/ - det=this->_convolutePixel(i,j,9); + if(tmpY<0) tmpY=width+tmpY; + if(tmpY>=height) tmpY=tmpY-height; - if(det>max) max=det; + val=image->getPixel(tmpX,tmpY); - determinants[i][j]=det; - maximas[i][j]=9; + pixelSumYY+=gyy[k][l]*val; + pixelSumXX+=gxx[k][l]*val; + pixelSumXY+=gxy[k][l]*val; + } + } - /*det=this->_convolutePixel(i,j,15); + //determinant of the Hessian Matrix + det = pixelSumXX*pixelSumYY-pow((pixelSumXY),2); - if(det>max) max=det; - if(det>determinants[i][j]) { - determinants[i][j]=det; - maximas[i][j]=15; - } + //map coordinates on the scaled image onto coordinates on the original image + mappingX=round(i*pow(scale,s)); + mappingY=round(j*pow(scale,s)); - det=this->_convolutePixel(i,j,21); - if(det>max) max=det; - if(det>determinants[i][j]) { - determinants[i][j]=det; - maximas[i][j]=21; - } - det=this->_convolutePixel(i,j,27); - if(det>max) max=det; - if(det>determinants[i][j]) { - determinants[i][j]=det; - maximas[i][j]=27; - }*/ + if(det>determinants[mappingX][mappingY]) { + //if(det>max) max=det; + determinants[mappingX][mappingY]=det; + maximas[mappingX][mappingY]=kernelSize*pow(scale,s); + } } - //cout << "\n"; } + image->scale(scale); + } //scale-space - /*image->scale(scale); - - } //scale-space*/ - - //TODO: - int tmp; - - int xStart=0; int xEnd=0; - int yStart=0; int yEnd=0; - //int threshold=0.15*max; - //loop over each pixel and calculate the magnitutes and angles of gradient for(int i=0;i<image->getHeight();i++) { if(i>=(image->getHeight()-1)) { xStart=i-1; @@ -246,8 +200,6 @@ yStart=j-1; yEnd=j+1; } - - //cout << i << " "; /**if any determinant in the area around the pixel is *greater than the pixel, suppress the current pixel * @@ -263,186 +215,190 @@ determinants[i][j]>determinants[xEnd][yStart] && determinants[i][j]>determinants[xEnd][j] && determinants[i][j]>determinants[xEnd][yEnd] ) { - this->_insertToList(i,j,determinants[i][j]); - - /*image->drawCircle(j,i,maximas[i][j]/2); - image->drawCircle(j,i,1); - cout << maximas[i][j] << " ";*/ + this->_insertToList(&i,&j); } - /*p=(determinants[i][yStart]-determinants[i][j]+determinants[xStart][yStart]-determinants[xStart][j])/2; - q=(determinants[i][j]-determinants[xStart][j]+determinants[i][yStart]-determinants[xStart][yStart])/2; - //magnitude - m[i][j]=sqrt(pow(p,2)+pow(q,2)); - //orientation in degrees - if(p==0) deg=0; - else deg=atan(q/p)* 180 / PI; - - if(deg<0) deg=360+deg; - - tmp=(int)deg/22.5; - - //sector(orientation) - switch(tmp) { - case 0: - case 15: - a[i][j]=0; - break; - case 1: - case 2: - a[i][j]=1; - break; - case 3: - case 12: - a[i][j]=2; - break; - case 13: - case 14: - a[i][j]=3; - break; - }*/ - //cout << a[i][j] <<" "; } //cout << "\n"; } - cout << "\n"; + return true; +} +bool HessianDetector::_boxFilterDetect(int kernelSize) { + //cout << "started detecting"<< kernelSize <<"\n"; + int height = this->image->getHeightBW(); + int width = this->image->getWidthBW(); - /*int threshold=0.15*max; + for(int i=14;i<(height-14);i++) { + for(int j=14; j<(width-14);j++) { - for(int i=3;i<(image->getHeight()-1);i++) { - /*if(i==0) tmpX=height+tmpX; - if(tmpX>=height) tmpX=tmpX-height; - for(int j=3; j<(image->getWidth()-1);j++) { + //calculate the determinants around the pixel, because of non-maxima suppression + for(int k=-1;k<2;k++) { + for(int l=-1; l<2;l++) { + if(determinants[i+k][j+l]==-99999) { //if determinant for that pixel hasn't been set + determinants[i+k][j+l]=this->_convolutePixel(&i,&j,&kernelSize); + maximas[i+k][j+l]=kernelSize; + } + } + } - /** - * Non-maxima suppression: + /**Non-maxima suppression + *if any determinant in the area around the pixel is + *greater than the pixel, suppress the current pixel. * - * Suppress all the pixels where the magnitude value is - * not greater than both the values of neighbouring pixels on the line - * in the direction of gradient + * This can also be done in a loop. + * */ - /* switch(a[i][j]) { //4 direction of the gradient - case 0: - if(m[i][j]>m[i-1][j] && m[i][j]>m[i+1][j] && determinants[i][j]>threshold) { - image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); - } - break; - case 1: - if(m[i][j]>m[i-1][j+1] && m[i][j]>m[i+1][j-1] &&determinants[i][j]>threshold) { - image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); - } - break; - case 2: - if(m[i][j]>m[i-1][j] && m[i][j]>m[i+1][j] && determinants[i][j]>threshold) { - image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); - } - break; - - case 3: - if(m[i][j]>m[i-1][j-1] && m[i][j]>m[i+1][j+1] && determinants[i][j]>threshold) { - image->drawCircle(j,i,round(offsetX*pow(scale,maximas[i][j]))); - } - break; + if(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][j-1] && + 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); } - } - }*/ + //cout << determinants[i][j]<<"\n"; + } + //cout << "\n"; + } + + /*image->scale(scale); + + } //scale-space*/ return true; } -int HessianDetector::_getHessianDeterminant(int pixelSumXX, int pixelSumXY, int pixelSumYY) { - return pixelSumXX*pixelSumYY-pow((0.9*pixelSumXY),2); +int HessianDetector::_getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int* pixelSumYY) { + return *pixelSumXX*(*pixelSumYY)-pow((0.9*(*pixelSumXY)),2); } -int HessianDetector::_convolutePixel(int i, int j, int kernelSize) { +int HessianDetector::_convolutePixel(int* i, int* j, int* kernelSize) { //for box filters only int pixelSumYY=0; int pixelSumXX=0; int pixelSumXY=0; int det; - switch(kernelSize) { + switch(*kernelSize) { case 9: //9x9 kernel - pixelSumXX=1*this->image->getRegionSum(i-4,j-2,i-2,j+2); - pixelSumXX+=1*this->image->getRegionSum(i+2,j-2,i+4,j+2); - pixelSumXX+=-2*this->image->getRegionSum(i-1,j-2,i+1,j+2); + pixelSumXX=1*this->image->getRegionSum(*i-4,*j-2,*i-2,*j+2); + pixelSumXX+=1*this->image->getRegionSum(*i+2,*j-2,*i+4,*j+2); + pixelSumXX+=-2*this->image->getRegionSum(*i-1,*j-2,*i+1,*j+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+=1*this->image->getRegionSum(i-3,j-3,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+3,j+3); + 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+=1*this->image->getRegionSum(*i-3,*j-3,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+3,*j+3); - pixelSumYY=1*this->image->getRegionSum(i-2,j-4,i+2,j-2); - pixelSumYY+=1*this->image->getRegionSum(i-2,j+2,i+2,j+4); - pixelSumYY+=-2*this->image->getRegionSum(i-2,j-1,i+2,j+1); + pixelSumYY=1*this->image->getRegionSum(*i-2,*j-4,*i+2,*j-2); + pixelSumYY+=1*this->image->getRegionSum(*i-2,*j+2,*i+2,*j+4); + pixelSumYY+=-2*this->image->getRegionSum(*i-2,*j-1,*i+2,*j+1); //determinant of the Hessian Matrix - det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY); + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); break; + case 11: + //11x11 kernel + pixelSumXX=1*this->image->getRegionSum(*i-5,*j-3,*i-2,*j+3); + pixelSumXX+=1*this->image->getRegionSum(*i+2,*j-3,*i+5,*j+3); + pixelSumXX+=-2*this->image->getRegionSum(*i-1,*j-3,*i+1,*j+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+=1*this->image->getRegionSum(*i-4,*j-4,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+4,*j+4); + + pixelSumYY=1*this->image->getRegionSum(*i-3,*j-5,*i+3,*j-2); + pixelSumYY+=1*this->image->getRegionSum(*i-3,*j+2,*i+3,*j+5); + pixelSumYY+=-2*this->image->getRegionSum(*i-3,*j-1,*i+3,*j+1); + //determinant of the Hessian Matrix + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); + break; case 15: //15x15 kernel - pixelSumXX=1*this->image->getRegionSum(i-7,j-4,i-3,j+4); - pixelSumXX+=1*this->image->getRegionSum(i+3,j-4,i+7,j+4); - pixelSumXX+=-2*this->image->getRegionSum(i-2,j-4,i+2,j+4); + pixelSumXX=1*this->image->getRegionSum(*i-7,*j-4,*i-3,*j+4); + pixelSumXX+=1*this->image->getRegionSum(*i+3,*j-4,*i+7,*j+4); + pixelSumXX+=-2*this->image->getRegionSum(*i-2,*j-4,*i+2,*j+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+=1*this->image->getRegionSum(i-5,j-5,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+5,j+5); + 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+=1*this->image->getRegionSum(*i-5,*j-5,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+5,*j+5); - pixelSumYY=1*this->image->getRegionSum(i-4,j-7,i+4,j-3); - pixelSumYY+=1*this->image->getRegionSum(i-4,j+3,i+4,j+7); - pixelSumYY+=-2*this->image->getRegionSum(i-4,j-2,i+4,j+2); + pixelSumYY=1*this->image->getRegionSum(*i-4,*j-7,*i+4,*j-3); + pixelSumYY+=1*this->image->getRegionSum(*i-4,*j+3,*i+4,*j+7); + pixelSumYY+=-2*this->image->getRegionSum(*i-4,*j-2,*i+4,*j+2); - det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/2.7778; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/2.7778; break; + case 17: + //17x17 kernel + pixelSumXX=1*this->image->getRegionSum(*i-8,*j-4,*i-3,*j+4); + pixelSumXX+=1*this->image->getRegionSum(*i+3,*j-4,*i+8,*j+4); + pixelSumXX+=-2*this->image->getRegionSum(*i-2,*j-4,*i+2,*j+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+=1*this->image->getRegionSum(*i-6,*j-6,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+6,*j+6); + + pixelSumYY=1*this->image->getRegionSum(*i-4,*j-8,*i+4,*j-3); + pixelSumYY+=1*this->image->getRegionSum(*i-4,*j+3,*i+4,*j+8); + pixelSumYY+=-2*this->image->getRegionSum(*i-4,*j-2,*i+4,*j+2); + //determinant of the Hessian Matrix + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); + break; case 21: //21x21 kernel - pixelSumXX=1*this->image->getRegionSum(i-10,j-6,i-4,j+6); - pixelSumXX+=1*this->image->getRegionSum(i+4,j-6,i+10,j+6); - pixelSumXX+=-2*this->image->getRegionSum(i-3,j-6,i+3,j+6); + pixelSumXX=1*this->image->getRegionSum(*i-10,*j-6,*i-4,*j+6); + pixelSumXX+=1*this->image->getRegionSum(*i+4,*j-6,*i+10,*j+6); + pixelSumXX+=-2*this->image->getRegionSum(*i-3,*j-6,*i+3,*j+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+=1*this->image->getRegionSum(i-7,j-7,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+7,j+7); + 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+=1*this->image->getRegionSum(*i-7,*j-7,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+7,*j+7); - pixelSumYY=1*this->image->getRegionSum(i-6,j-10,i+6,j-4); - pixelSumYY+=1*this->image->getRegionSum(i-6,j+4,i+6,j+10); - pixelSumYY+=-2*this->image->getRegionSum(i-6,j-3,i+6,j+3); + pixelSumYY=1*this->image->getRegionSum(*i-6,*j-10,*i+6,*j-4); + pixelSumYY+=1*this->image->getRegionSum(*i-6,*j+4,*i+6,*j+10); + pixelSumYY+=-2*this->image->getRegionSum(*i-6,*j-3,*i+6,*j+3); - det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/5.4444; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/5.4444; break; case 27: //27x27 kernel - pixelSumXX=1*this->image->getRegionSum(i-13,j-7,i-5,j+7); - pixelSumXX+=1*this->image->getRegionSum(i+5,j-7,i+13,j+7); - pixelSumXX+=-2*this->image->getRegionSum(i-4,j-7,i+4,j+7); + pixelSumXX=1*this->image->getRegionSum(*i-13,*j-7,*i-5,*j+7); + pixelSumXX+=1*this->image->getRegionSum(*i+5,*j-7,*i+13,*j+7); + pixelSumXX+=-2*this->image->getRegionSum(*i-4,*j-7,*i+4,*j+7); - pixelSumXY=-1*this->image->getRegionSum(i-9,j+1,i-1,j+9); - pixelSumXY+=-1*this->image->getRegionSum(i+1,j-9,i+7,j-1); - pixelSumXY+=1*this->image->getRegionSum(i-9,j-9,i-1,j-1); - pixelSumXY+=1*this->image->getRegionSum(i+1,j+1,i+9,j+9); + pixelSumXY=-1*this->image->getRegionSum(*i-9,*j+1,*i-1,*j+9); + pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-9,*i+7,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i-9,*j-9,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+9,*j+9); - pixelSumYY=1*this->image->getRegionSum(i-7,j-13,i+7,j-5); - pixelSumYY+=1*this->image->getRegionSum(i-7,j+5,i+7,j+13); - pixelSumYY+=-2*this->image->getRegionSum(i-7,j-4,i+7,j+4); + pixelSumYY=1*this->image->getRegionSum(*i-7,*j-13,*i+7,*j-5); + pixelSumYY+=1*this->image->getRegionSum(*i-7,*j+5,*i+7,*j+13); + pixelSumYY+=-2*this->image->getRegionSum(*i-7,*j-4,*i+7,*j+4); - det=_getHessianDeterminant(pixelSumXX,pixelSumXY,pixelSumYY)/9; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/9; + break; } return det; } -void HessianDetector::_insertToList(int x, int y, int det) { +void HessianDetector::_insertToList(int* x, int* y) { vector<int> point; point.resize(2); - point[0]=x; - point[1]=y; + point[0]=*x; + point[1]=*y; + if(this->orderedList.size()>=this->nrPoints) { vector<int> tmp=this->orderedList.back(); - if(det<=determinants[tmp[0]][tmp[1]]) return; + if(determinants[*x][*y]<=determinants[tmp[0]][tmp[1]]) return; tmp = this->orderedList.front(); - if(det>=determinants[tmp[0]][tmp[1]]) { + if(determinants[*x][*y]>=determinants[tmp[0]][tmp[1]]) { this->orderedList.insert(this->orderedList.begin(),point); this->orderedList.pop_back(); return; @@ -454,12 +410,12 @@ return; } vector<int> tmp=this->orderedList.back(); - if(det<=determinants[tmp[0]][tmp[1]]) { + if(determinants[*x][*y]<=determinants[tmp[0]][tmp[1]]) { this->orderedList.push_back(point); return; } tmp = this->orderedList.front(); - if(det>=determinants[tmp[0]][tmp[1]]) { + if(determinants[*x][*y]>=determinants[tmp[0]][tmp[1]]) { orderedList.insert(orderedList.begin(),point); return; } @@ -467,7 +423,7 @@ vector<vector<int> >::iterator iter1 = orderedList.begin(); while( iter1 != orderedList.end()) { vector<int > tmp=*iter1; - if(determinants[tmp[0]][tmp[1]]<=det) { + if(determinants[tmp[0]][tmp[1]]<=determinants[*x][*y]) { orderedList.insert(iter1,point); return; } @@ -476,14 +432,18 @@ } void HessianDetector::printPoints() { vector<vector<int> >::iterator iter1 = orderedList.begin(); - iter1 = orderedList.begin(); + 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[1],tmp2[0],maximas[tmp2[0]][tmp2[1]]/2); - this->image->drawCircle(tmp2[1],tmp2[0],1); + c++; + //this->image->drawCircle(tmp2[1],tmp2[0],1); iter1++; } this->image->show(); - //cout << "\n"; + //cout << c <<"\n"; } +vector<vector<int> > HessianDetector::getPoints() { + return this->orderedList; +} Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-07-08 18:03:45 UTC (rev 2246) +++ gsoc07_featuredetection/HessianDetector.h 2007-07-08 22:11:59 UTC (rev 2247) @@ -30,22 +30,12 @@ class HessianDetector { + public: + HessianDetector(Image* i, int nrPoints=1000, CONVOLUTION_TYPE type=HD_BOX_FILTERS); - public: - HessianDetector(Image* i, int nrPoints=100, CONVOLUTION_TYPE type=HD_BOX_FILTERS); - - bool detect(); - void _insertToList(int x, int y, int det); + bool detect(int kernelSize); void printPoints(); - /*void convolute(int* kernel,int dim1, int dim2,double scale); - int getPixel(int x,int y); - int getWidth(); - int getWidthBW(); - int getHeight(); - int getHeightBW(); - void scale(int factor); - Image* getCopy(); - void drawCircle(int x,int y, int radius);*/ + vector<vector<int> > getPoints(); /* private slots: */ @@ -56,11 +46,13 @@ CONVOLUTION_TYPE convolutionType; vector<vector<int> > determinants; //holds the values of the hessian determinant for each pixel vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum - vector<vector<int> > orderedList; //first n pixels the largest determinant values + vector<vector<int> > orderedList; //first n pixels with the largest determinant values - - int _getHessianDeterminant(int pixelSumXX, int pixelSumXY, int pixelSumYY); - int _convolutePixel(int coordX, int coordY, int kernelSize); + int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); + int _convolutePixel(int* coordX, int* coordY, int* kernelSize); + bool _boxFilterDetect(int kernelSize); + bool _slidingWDetect(int kernelSize); + void _insertToList(int* x, int* y); }; #endif /*HESSIANDETECTOR_H_*/ Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-07-08 18:03:45 UTC (rev 2246) +++ gsoc07_featuredetection/Image.cpp 2007-07-08 22:11:59 UTC (rev 2247) @@ -139,7 +139,11 @@ } void Image::drawCircle(int x,int y, int radius) { 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)); +} void Image::smooth() { //TODO: create a gaussian mask and call the function convolute } Modified: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h 2007-07-08 18:03:45 UTC (rev 2246) +++ gsoc07_featuredetection/Image.h 2007-07-08 22:11:59 UTC (rev 2247) @@ -46,6 +46,7 @@ void scale(double factor); Image* getCopy(); void drawCircle(int x,int y, int radius); + void drawRectangle(int x,int y, int radius); void smooth(); void integrate(); int getRegionSum(int x1, int y1, int x2, int y2); Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-07-08 18:03:45 UTC (rev 2246) +++ gsoc07_featuredetection/main.cpp 2007-07-08 22:11:59 UTC (rev 2247) @@ -28,34 +28,54 @@ #include <stdio.h> #include <iostream> #include <stdlib.h> +#include <math.h> +#include <ctime> #include <string> #include "Image.h" #include "HessianDetector.h" +#include "ANN/ANN.h" using namespace std; int main(int argc, char *argv[]) { - string mystr; + + clock_t start,finish; + double time; + + int nrPoints=500; if(argc!=1) { cout << "Usage: ./main path_to_image" << "\n"; return 0; } - mystr="Praprot.jpg"; - - Image im(mystr); + Image im("Praprot.jpg"); if(im.open()) { - cout << "Image opened!!!" << "\n"; + // cout << "Image opened!!!" << "\n"; } else { - cout<< "Error!!!"<<"\n"; + cout<< "Error! Image can not be opened"<<"\n"; return 0; } - HessianDetector hd(&im); - if(!hd.detect()) { + //need to integrate the image before the detection process(only if using box filter approximation) + im.integrate(); + + //cout << im.getRegionSum(2,2,4,4); + + + start = clock(); + + HessianDetector hd(&im,nrPoints, HD_BOX_FILTERS); + if(!hd.detect(9)) { cout << "Detection of points failed!"; return 1; } + //print points and display image with the detected points(only for debugging) + //hd.printPoints(); + + finish = clock(); + + time = (double(finish)-double(start))/CLOCKS_PER_SEC; + cout << "Measured time:"<<time<<"\n"; return EXIT_SUCCESS; } Added: gsoc07_featuredetection/test/README =================================================================== --- gsoc07_featuredetection/test/README (rev 0) +++ gsoc07_featuredetection/test/README 2007-07-08 22:11:59 UTC (rev 2247) @@ -0,0 +1,3 @@ +File for testing is main.cpp. +Requirements: +- ANN library for nearest neighbour search(http://www.cs.umd.edu/~mount/ANN/) Added: gsoc07_featuredetection/test/main.cpp =================================================================== --- gsoc07_featuredetection/test/main.cpp (rev 0) +++ gsoc07_featuredetection/test/main.cpp 2007-07-08 22:11:59 UTC (rev 2247) @@ -0,0 +1,191 @@ +/*************************************************************************** + * 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 1 +//#define USE_VIGRA 1 + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <iostream> +#include <stdlib.h> +#include <math.h> + +#include <string> +#include "Image.h" +#include "HessianDetector.h" +#include "ANN/ANN.h" + +using namespace std; + +int main(int argc, char *argv[]) +{ + int kernelArray[]={9,11,15,17,21,27}; + + double nrPoints=1000; + + string mystr; + if(argc!=1) { + cout << "Usage: ./main path_to_image" << "\n"; + return 0; + } + + mystr="graffiti/img1.ppm"; + Image im2(mystr); + if(im2.open()) { + // cout << "Image opened!!!" << "\n"; + } else { + cout<< "Error!!!"<<"\n"; + return 0; + } + im2.integrate(); + + mystr="graffiti/img6.ppm"; + Image im(mystr); + if(im.open()) { + //cout << "Image opened!!!" << "\n"; + } else { + cout<< "Error!!!"<<"\n"; + return 0; + } + im.integrate(); + + double homography[3][3]= { + 1.0427236e+00, 1.2359858e-02,-1.6974167e+01 + ,-4.2238744e-03, 1.0353397e+00,-4.5312478e+01 + , 1.2020516e-05, 8.2950327e-06, 1.0000000e+00 + }; + + int nrNeighbours = 1; //number of nearest neighbours + + ANNpoint queryPt; // query point + ANNpoint closestPt; // closest point to the query point + ANNidxArray nnIdx; // near neighbor indices + ANNdistArray dists; // near neighbor distances + + ANNpointArray dataPts; // data points + + ANNkd_tree* kdTree; + + for(int i=0;i<6;i++) { //over all possible kernels + + int pointsInRegion=0; + + //detector for the first image + HessianDetector hd2(&im2,nrPoints); + if(!hd2.detect(kernelArray[i])) { + cout << "Detection of points failed!"; + return 1; + } + //hd2.printPoints(); + + //get detected points + vector<vector<int> > points1 = hd2.getPoints(); + + HessianDetector hd(&im,nrPoints,HD_BOX_FILTERS); + if(!hd.detect(kernelArray[i])) { + cout << "Detection of points failed!"; + return 1; + } + //hd.printPoints(); + + vector<vector<int> > points2 = hd.getPoints(); + + vector<int > point; + + dataPts = annAllocPts(nrPoints, 2); // allocate data points + + int pointCount=0; + + //fill the points array with the resulting points from the detector + vector<vector<int> >::iterator iter = points2.begin(); + while( iter != points2.end()) { + point=*iter; + ANNpoint pTmp= annAllocPt(2); + pTmp[0]=point[0]; + pTmp[1]=point[1]; + dataPts[pointCount]= pTmp; + pointCount++; + //cout << "("<<pTmp[0]<<","<<pTmp[1]<< ","<< ")\n"; + iter++; + } + + //create a tree of 2 dimension from the points + kdTree = new ANNkd_tree(dataPts,nrPoints,2); + + vector<double> result; + double tmp=0; + double score=0; + + vector<vector<int> >::iterator iter1 = points1.begin(); + while( iter1 != points1.end()) { + vector<int > point=*iter1; + if(point[0]>200 && point[0]<400 && point[1]>200 && point[1]<400) { + //cout << "("<<point[0]<<","<<point[1]<< ","<< point[2] <<")->\n"; + pointsInRegion++; + result.clear(); + + //multiply the pixel with the homography + for(int i=0;i<3;i++) { + tmp=0; + tmp+=point[0]*homography[i][1]; + tmp+=point[1]*homography[i][0]; + tmp+=homography[i][2]; + result.push_back(tmp); + } + //cout << "("<<result[1]/result[2]<< ","<<result[0]/result[2]<<","<< result[2]/result[2]<<")\n"; + + queryPt = annAllocPt(2); // allocate query point + queryPt[1]=result[0]/result[2]; + queryPt[0]=result[1]/result[2]; + + //cout << "("<<queryPt[0]<<","<<queryPt[1]<< ","<< ")\n"; + + nnIdx = new ANNidx[nrNeighbours]; // allocate near neigh indices + dists = new ANNdist[nrNeighbours]; // allocate near neighbor dists + + //search for closest point on the second image + kdTree->annkSearch( // search + queryPt, // query point + nrNeighbours, // number of near neighbors + nnIdx, // nearest neighbors (returned) + dists, // distance (returned) + 0); // error bound + + for (int l = 0; l < nrNeighbours; l++) { // print summary + dists[l] = sqrt(dists[l]); // unsquare distance + closestPt = dataPts[nnIdx[l]]; + //cout << "\t" << "\t(" << closestPt[0] << ","<< closestPt[1]<< ") " << nnIdx[l] << "\t" << dists[l] << "\n"; + //if pixel is closer than 1.5 we have correspondence + if(dists[l]<1.5) { + score++; + } + } + } + iter1++; + } + double repeatability= score/pointsInRegion; + cout << repeatability <<" "; + } + //} + return EXIT_SUCCESS; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-11 22:10:09
|
Revision: 2255 http://hugin.svn.sourceforge.net/hugin/?rev=2255&view=rev Author: stereo_sl Date: 2007-07-11 15:10:07 -0700 (Wed, 11 Jul 2007) Log Message: ----------- - class for the descriptor - started working on orientation assignment of interest points Added Paths: ----------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h Added: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp (rev 0) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-11 22:10:07 UTC (rev 2255) @@ -0,0 +1,77 @@ +/*************************************************************************** + * 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 <stdlib.h> +#include "Descriptor.h" + +#define NR_ANGLE_BINS 36 + +using namespace std; + +Descriptor::Descriptor(Image* i) { + this->image=i; +} + +void Descriptor::setPoints(vector<vector<int> >* pts) { + this->interestPoints=pts; +} +void Descriptor::orientate() { + vector<vector<int> >::iterator iter1 = this->interestPoints->begin(); + int regionSize; + int kernelSize; + int response1; + int response2; + int angle; + double magnitude; + int angles[NR_ANGLE_BINS]; + while( iter1 != this->interestPoints->end()) { //loop over every interest point + vector<int > interestpoint=*iter1; + + regionSize=round(_getMaxima(interestpoint[0], interestpoint[1])*6); + kernelSize=round(_getMaxima(interestpoint[0], interestpoint[1])*4); + + for(int i=interestpoint[0]-regionSize/2;i<interestpoint[0]+regionSize/2;i++) { + for(int j=interestpoint[1]-regionSize/2; j<interestpoint[1]+regionSize/2;j++) { + response1=this->image->getRegionSum(i-kernelSize,j-kernelSize,i,j)-this->image->getRegionSum(i,j,i+kernelSize,j+kernelSize); + response2=this->image->getRegionSum(i-kernelSize,j,i,j+kernelSize)-this->image->getRegionSum(i,j-kernelSize,i+kernelSize,j); + + //magnitude is the length of the vector (response1, response2) + magnitude=_euclidianDistance(0,0,response1, response2); + + //TODO: weight magnitude with gaussian, centered at interest point + + angle=round(atan(response2/response1) * 180 / PI); + angles[angle%NR_ANGLE_BINS]+=magnitude; + } + } + + iter1++; + } + +} +double Descriptor::_getMaxima(int x,int y) { + //TODO: + return 1.2; +} +double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { + return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); +} Added: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h (rev 0) +++ gsoc07_featuredetection/Descriptor.h 2007-07-11 22:10:07 UTC (rev 2255) @@ -0,0 +1,46 @@ +/*************************************************************************** + * 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 DESCRIPTOR_H_INCLUDED +#define DESCRIPTOR_H_INCLUDED +#include "Image.h" + +#define PI 3.14159265 + +class Descriptor + { + public: + Descriptor(Image* i); + + void setPoints(vector<vector<int> >* pts); + void orientate(); + + private: + Image* image; + + double _getMaxima(int x,int y); + double _euclidianDistance(int x1, int y1, int x2, int y2); + + vector<vector<int> >* interestPoints; + vector<vector<int> >* maximas; + }; + + +#endif // DESCRIPTOR_H_INCLUDED This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-12 22:41:29
|
Revision: 2257 http://hugin.svn.sourceforge.net/hugin/?rev=2257&view=rev Author: stereo_sl Date: 2007-07-12 15:41:23 -0700 (Thu, 12 Jul 2007) Log Message: ----------- - orientation assignment with gaussian weighting Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.cpp gsoc07_featuredetection/Image.h gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-11 22:58:50 UTC (rev 2256) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-12 22:41:23 UTC (rev 2257) @@ -41,33 +41,72 @@ int response1; int response2; int angle; + int max; + int orientation; double magnitude; - int angles[NR_ANGLE_BINS]; + double angles[NR_ANGLE_BINS]; + + + while( iter1 != this->interestPoints->end()) { //loop over every interest point - vector<int > interestpoint=*iter1; + vector<int > interestPoint=*iter1; + //cout << interestPoint[0]<<","<<interestPoint[1]<<":"; + regionSize=round(_getMaxima(interestPoint[0], interestPoint[1])*6); - regionSize=round(_getMaxima(interestpoint[0], interestpoint[1])*6); - kernelSize=round(_getMaxima(interestpoint[0], interestpoint[1])*4); + //kernelSize=round(_getMaxima(interestPoint[0], interestPoint[1])*2); + kernelSize=2; - for(int i=interestpoint[0]-regionSize/2;i<interestpoint[0]+regionSize/2;i++) { - for(int j=interestpoint[1]-regionSize/2; j<interestpoint[1]+regionSize/2;j++) { - response1=this->image->getRegionSum(i-kernelSize,j-kernelSize,i,j)-this->image->getRegionSum(i,j,i+kernelSize,j+kernelSize); - response2=this->image->getRegionSum(i-kernelSize,j,i,j+kernelSize)-this->image->getRegionSum(i,j-kernelSize,i+kernelSize,j); + for(int i=0; i<NR_ANGLE_BINS;i++) { + angles[i]=0; + } + for(int i=interestPoint[0]-regionSize;i<interestPoint[0]+regionSize;i++) { + for(int j=interestPoint[1]-regionSize; j<interestPoint[1]+regionSize;j++) { + if(_euclidianDistance(interestPoint[0],interestPoint[1], i,j )< regionSize) { + + + response1=this->image->getRegionSum(i-kernelSize,j-kernelSize,i-1,j-1)-this->image->getRegionSum(i+1,j+1,i+kernelSize,j+kernelSize); + response2=this->image->getRegionSum(i-kernelSize,j+1,i-1,j+kernelSize)-this->image->getRegionSum(i+1,j-kernelSize,i+kernelSize,j-1); + + /*response1=this->image->getPixel(i+1,j)-this->image->getPixel(i-1,j); + response2=this->image->getPixel(i,j+1)-this->image->getPixel(i,j-1);*/ + //magnitude is the length of the vector (response1, response2) - magnitude=_euclidianDistance(0,0,response1, response2); + //magnitude=_euclidianDistance(this->image->getPixel(i+1,j),this->image->getPixel(i,j+1),this->image->getPixel(i-1,j), this->image->getPixel(i,j-1)); + magnitude=_euclidianDistance(0,0,response1,response2); - //TODO: weight magnitude with gaussian, centered at interest point + //weight magnitude with gaussian, centered at interest point, stdev=2.5*s + magnitude*=_gaussWeighting(interestPoint[0]-i,interestPoint[1]-j,1.5*_getMaxima(i,j)); - angle=round(atan(response2/response1) * 180 / PI); + angle=round(atan2(response2,response1) * 180 / PI); + + if(angle<0) angle = 360+angle; + angle+=45; + angles[angle%NR_ANGLE_BINS]+=magnitude; + } } } - + max=0; + orientation=0; + for(int i=0; i<NR_ANGLE_BINS;i++) { + if(angles[i]>max) { + max = angles[i]; + orientation=i; + } + } + orientation=orientation*(360/NR_ANGLE_BINS); + 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)); + //cout << orientation << "\n"; iter1++; } + this->image->show(); +} +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)); +} -} double Descriptor::_getMaxima(int x,int y) { //TODO: return 1.2; Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-11 22:58:50 UTC (rev 2256) +++ gsoc07_featuredetection/Descriptor.h 2007-07-12 22:41:23 UTC (rev 2257) @@ -37,6 +37,7 @@ double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); + double _gaussWeighting(int x, int y, double stdev); vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-07-11 22:58:50 UTC (rev 2256) +++ gsoc07_featuredetection/HessianDetector.h 2007-07-12 22:41:23 UTC (rev 2257) @@ -36,6 +36,7 @@ bool detect(int kernelSize); void printPoints(); vector<vector<int> > getPoints(); + vector<vector<int> > orderedList; //first n pixels with the largest determinant values /* private slots: */ @@ -46,7 +47,6 @@ CONVOLUTION_TYPE convolutionType; vector<vector<int> > determinants; //holds the values of the hessian determinant for each pixel vector<vector<double> > maximas; //holds the scales where scale-space representation for each pixel attends maximum - vector<vector<int> > orderedList; //first n pixels with the largest determinant values int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); int _convolutePixel(int* coordX, int* coordY, int* kernelSize); Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-07-11 22:58:50 UTC (rev 2256) +++ gsoc07_featuredetection/Image.cpp 2007-07-12 22:41:23 UTC (rev 2257) @@ -144,6 +144,12 @@ 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"; + cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,0)); +} + void Image::smooth() { //TODO: create a gaussian mask and call the function convolute } Modified: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h 2007-07-11 22:58:50 UTC (rev 2256) +++ gsoc07_featuredetection/Image.h 2007-07-12 22:41:23 UTC (rev 2257) @@ -46,6 +46,7 @@ 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(); Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-07-11 22:58:50 UTC (rev 2256) +++ gsoc07_featuredetection/main.cpp 2007-07-12 22:41:23 UTC (rev 2257) @@ -30,11 +30,12 @@ #include <stdlib.h> #include <math.h> #include <ctime> +#include <algorithm> #include <string> #include "Image.h" #include "HessianDetector.h" -#include "ANN/ANN.h" +#include "Descriptor.h" using namespace std; @@ -44,12 +45,12 @@ clock_t start,finish; double time; - int nrPoints=500; + int nrPoints=200; if(argc!=1) { cout << "Usage: ./main path_to_image" << "\n"; return 0; } - Image im("Praprot.jpg"); + Image im("boat/img4.pgm"); if(im.open()) { // cout << "Image opened!!!" << "\n"; } else { @@ -77,5 +78,10 @@ time = (double(finish)-double(start))/CLOCKS_PER_SEC; cout << "Measured time:"<<time<<"\n"; + + Descriptor d(&im); + d.setPoints(&hd.orderedList); + d.orientate(); + return EXIT_SUCCESS; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-15 10:33:18
|
Revision: 2264 http://hugin.svn.sourceforge.net/hugin/?rev=2264&view=rev Author: stereo_sl Date: 2007-07-15 03:33:15 -0700 (Sun, 15 Jul 2007) Log Message: ----------- - changed the orientation assignment Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-13 18:04:25 UTC (rev 2263) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-15 10:33:15 UTC (rev 2264) @@ -23,7 +23,7 @@ #include <stdlib.h> #include "Descriptor.h" -#define NR_ANGLE_BINS 36 +#define NR_ANGLE_BINS 4 using namespace std; @@ -38,64 +38,87 @@ vector<vector<int> >::iterator iter1 = this->interestPoints->begin(); int regionSize; int kernelSize; - int response1; - int response2; - int angle; + + //int angle; int max; int orientation; - double magnitude; - double angles[NR_ANGLE_BINS]; + //double angles[NR_ANGLE_BINS]; + //double angles[NR_ANGLE_BINS][2]; + double Sx[NR_ANGLE_BINS]; + double Sy[NR_ANGLE_BINS]; + double dx; + double dy; + + while( iter1 != this->interestPoints->end()) { //loop over every interest point vector<int > interestPoint=*iter1; //cout << interestPoint[0]<<","<<interestPoint[1]<<":"; - regionSize=round(_getMaxima(interestPoint[0], interestPoint[1])*6); + regionSize=round(_getMaxima(interestPoint[0], interestPoint[1])*3); - //kernelSize=round(_getMaxima(interestPoint[0], interestPoint[1])*2); - kernelSize=2; + kernelSize=round(_getMaxima(interestPoint[0], interestPoint[1])*2); for(int i=0; i<NR_ANGLE_BINS;i++) { - angles[i]=0; + Sx[i]=0; + Sy[i]=0; } - for(int i=interestPoint[0]-regionSize;i<interestPoint[0]+regionSize;i++) { - for(int j=interestPoint[1]-regionSize; j<interestPoint[1]+regionSize;j++) { - if(_euclidianDistance(interestPoint[0],interestPoint[1], i,j )< regionSize) { + for(int i=interestPoint[0]-regionSize;i<=interestPoint[0]+regionSize;i++) { + for(int j=interestPoint[1]-regionSize; j<=interestPoint[1]+regionSize;j++) { + double dist=_euclidianDistance(interestPoint[0],interestPoint[1], i,j ); + if(dist<= regionSize) { //if point is in the circle - response1=this->image->getRegionSum(i-kernelSize,j-kernelSize,i-1,j-1)-this->image->getRegionSum(i+1,j+1,i+kernelSize,j+kernelSize); - response2=this->image->getRegionSum(i-kernelSize,j+1,i-1,j+kernelSize)-this->image->getRegionSum(i+1,j-kernelSize,i+kernelSize,j-1); + double weight=_gaussWeighting(interestPoint[0]-i,interestPoint[1]-j,2.5*_getMaxima(i,j)); - /*response1=this->image->getPixel(i+1,j)-this->image->getPixel(i-1,j); - response2=this->image->getPixel(i,j+1)-this->image->getPixel(i,j-1);*/ + //x directon + dx=this->image->getRegionSum(i-kernelSize, j,i+kernelSize,j+kernelSize); + dx-=this->image->getRegionSum(i-kernelSize, j-kernelSize,i+kernelSize,j); + dx*=weight; - //magnitude is the length of the vector (response1, response2) - //magnitude=_euclidianDistance(this->image->getPixel(i+1,j),this->image->getPixel(i,j+1),this->image->getPixel(i-1,j), this->image->getPixel(i,j-1)); - magnitude=_euclidianDistance(0,0,response1,response2); + //y direction + dy=this->image->getRegionSum(i,j-kernelSize,i+kernelSize, j+kernelSize); + dy-=this->image->getRegionSum(i-kernelSize,j-kernelSize,i, j+kernelSize); + dy*=weight; - //weight magnitude with gaussian, centered at interest point, stdev=2.5*s - magnitude*=_gaussWeighting(interestPoint[0]-i,interestPoint[1]-j,1.5*_getMaxima(i,j)); + if(dx>0) { + if(dy>0) { + Sx[0]+=dx; + Sy[0]+=dy; + } else { + Sx[1]+=dx; + Sy[1]+=dy; + } + } else { + if(dy>0) { + Sx[3]+=dx; + Sy[3]+=dy; + } else { + Sx[2]+=dx; + Sy[2]+=dy; + } + } - angle=round(atan2(response2,response1) * 180 / PI); + } //if point in circle + } //for j + } //for i + max=0; + orientation=0; - if(angle<0) angle = 360+angle; - angle+=45; - angles[angle%NR_ANGLE_BINS]+=magnitude; - } - } - } - max=0; - orientation=0; for(int i=0; i<NR_ANGLE_BINS;i++) { - if(angles[i]>max) { - max = angles[i]; + double tmp = _euclidianDistance(0,0,Sx[i],Sy[i]); + if(tmp>max) { + max = tmp; orientation=i; } } - orientation=orientation*(360/NR_ANGLE_BINS); + + orientation=round(atan2(Sy[orientation],Sx[orientation]) * 180 / PI); + //if(orientation<0) orientation=360+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)); //cout << orientation << "\n"; @@ -103,13 +126,14 @@ } this->image->show(); } + 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)); } double Descriptor::_getMaxima(int x,int y) { //TODO: - return 1.2; + return 2.4; } double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-13 18:04:25 UTC (rev 2263) +++ gsoc07_featuredetection/Descriptor.h 2007-07-15 10:33:15 UTC (rev 2264) @@ -28,6 +28,7 @@ { public: Descriptor(Image* i); + double _gaussWeighting(int x, int y, double stdev); void setPoints(vector<vector<int> >* pts); void orientate(); @@ -37,7 +38,6 @@ double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); - double _gaussWeighting(int x, int y, double stdev); vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-16 21:37:17
|
Revision: 2269 http://hugin.svn.sourceforge.net/hugin/?rev=2269&view=rev Author: stereo_sl Date: 2007-07-16 14:37:11 -0700 (Mon, 16 Jul 2007) Log Message: ----------- - added sampling in the orientation assignment - code reorganization and preparation for the final description process Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-16 21:20:02 UTC (rev 2268) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-16 21:37:11 UTC (rev 2269) @@ -23,12 +23,11 @@ #include <stdlib.h> #include "Descriptor.h" -#define NR_ANGLE_BINS 4 - using namespace std; -Descriptor::Descriptor(Image* i) { +Descriptor::Descriptor(Image* i,HessianDetector* hessianDetector) { this->image=i; + this->hd=hessianDetector; } void Descriptor::setPoints(vector<vector<int> >* pts) { @@ -36,13 +35,18 @@ } void Descriptor::orientate() { vector<vector<int> >::iterator iter1 = this->interestPoints->begin(); - int regionSize; + double regionSize; int kernelSize; //int angle; int max; int orientation; + double step; + //coordinates of the sample + int pointX; + int pointY; + //double angles[NR_ANGLE_BINS]; //double angles[NR_ANGLE_BINS][2]; @@ -52,35 +56,48 @@ double dx; double dy; + int pointCount=0; while( iter1 != this->interestPoints->end()) { //loop over every interest point vector<int > interestPoint=*iter1; //cout << interestPoint[0]<<","<<interestPoint[1]<<":"; - regionSize=round(_getMaxima(interestPoint[0], interestPoint[1])*3); - + regionSize=_getMaxima(interestPoint[0], interestPoint[1])*3; kernelSize=round(_getMaxima(interestPoint[0], interestPoint[1])*2); + step=_getMaxima(interestPoint[0], interestPoint[1]); for(int i=0; i<NR_ANGLE_BINS;i++) { Sx[i]=0; Sy[i]=0; } - - for(int i=interestPoint[0]-regionSize;i<=interestPoint[0]+regionSize;i++) { + /*for(int i=interestPoint[0]-regionSize;i<=interestPoint[0]+regionSize;i++) { for(int j=interestPoint[1]-regionSize; j<=interestPoint[1]+regionSize;j++) { - double dist=_euclidianDistance(interestPoint[0],interestPoint[1], i,j ); - if(dist<= regionSize) { //if point is in the circle + cout << "(" <<this->image->getPixel(i,j)<< "," << this->image->getIntegralPixel(i,j) <<") "; + } + cout << "\n"; + }*/ - double weight=_gaussWeighting(interestPoint[0]-i,interestPoint[1]-j,2.5*_getMaxima(i,j)); + for(double i=(interestPoint[0]-regionSize);i<=(interestPoint[0]+regionSize);i+=step) { + for(double j=(interestPoint[1]-regionSize); j<=(interestPoint[1]+regionSize);j+=step) { + //pixels have integer values + pointX=round(i); + pointY=round(j); + //pointX and pointY are the coordinates of the sample point + + double dist=_euclidianDistance(interestPoint[0],interestPoint[1], pointX,pointY); + if(dist<=regionSize) { //if point is in the circle + + double weight=_gaussWeighting(interestPoint[0]-pointX,interestPoint[1]-pointY,2.5*_getMaxima(pointX,pointY)); + //x directon - dx=this->image->getRegionSum(i-kernelSize, j,i+kernelSize,j+kernelSize); - dx-=this->image->getRegionSum(i-kernelSize, j-kernelSize,i+kernelSize,j); + dx=this->image->getRegionSum(pointX-kernelSize, pointY,pointX+kernelSize,pointY+kernelSize); + dx-=this->image->getRegionSum(pointX-kernelSize, pointY-kernelSize,pointX+kernelSize,pointY); dx*=weight; //y direction - dy=this->image->getRegionSum(i,j-kernelSize,i+kernelSize, j+kernelSize); - dy-=this->image->getRegionSum(i-kernelSize,j-kernelSize,i, j+kernelSize); + dy=this->image->getRegionSum(pointX,pointY-kernelSize,pointX+kernelSize, pointY+kernelSize); + dy-=this->image->getRegionSum(pointX-kernelSize,pointY-kernelSize,pointX, pointY+kernelSize); dy*=weight; if(dx>0) { @@ -107,7 +124,6 @@ max=0; orientation=0; - for(int i=0; i<NR_ANGLE_BINS;i++) { double tmp = _euclidianDistance(0,0,Sx[i],Sy[i]); if(tmp>max) { @@ -119,10 +135,13 @@ orientation=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)); //cout << orientation << "\n"; iter1++; + //pointCount++; } this->image->show(); } @@ -130,10 +149,8 @@ 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)); } - double Descriptor::_getMaxima(int x,int y) { - //TODO: - return 2.4; + 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)); Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-16 21:20:02 UTC (rev 2268) +++ gsoc07_featuredetection/Descriptor.h 2007-07-16 21:37:11 UTC (rev 2269) @@ -21,13 +21,14 @@ #ifndef DESCRIPTOR_H_INCLUDED #define DESCRIPTOR_H_INCLUDED #include "Image.h" +#include "HessianDetector.h" -#define PI 3.14159265 +#define NR_ANGLE_BINS 4 class Descriptor { public: - Descriptor(Image* i); + Descriptor(Image* i, HessianDetector* hd); double _gaussWeighting(int x, int y, double stdev); void setPoints(vector<vector<int> >* pts); @@ -35,12 +36,14 @@ private: Image* image; + HessianDetector* hd; double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; + int orientations[]; }; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-16 21:20:02 UTC (rev 2268) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-16 21:37:11 UTC (rev 2269) @@ -23,8 +23,6 @@ #include <math.h> #include "HessianDetector.h" -#define PI 3.14159265 - using namespace std; HessianDetector::HessianDetector(Image* i, int nrPoints, CONVOLUTION_TYPE type) { @@ -237,7 +235,7 @@ for(int l=-1; l<2;l++) { if(determinants[i+k][j+l]==-99999) { //if determinant for that pixel hasn't been set determinants[i+k][j+l]=this->_convolutePixel(&i,&j,&kernelSize); - maximas[i+k][j+l]=kernelSize; + maximas[i+k][j+l]=_getScale(kernelSize); } } } @@ -444,6 +442,18 @@ this->image->show(); //cout << c <<"\n"; } -vector<vector<int> > HessianDetector::getPoints() { - return this->orderedList; +vector<vector<int> >* HessianDetector::getPoints() { + return &this->orderedList; } +int HessianDetector::getNrPoints() { + return this->nrPoints; +} +double HessianDetector::getMaxima(int x, int y) { + return this->maximas[x][y]; +} +double HessianDetector::_getScale(int kernelSize) { + return kernelSize/HD_INIT_KERNEL_SIZE; +} +void HessianDetector::dump() { + delete(&determinants); +} Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-07-16 21:20:02 UTC (rev 2268) +++ gsoc07_featuredetection/HessianDetector.h 2007-07-16 21:37:11 UTC (rev 2269) @@ -28,6 +28,11 @@ #define HD_SLIDING_WINDOW 2 #define HD_BOX_FILTERS 1 +//initial kernel size, representing scale 1.2 +#define HD_INIT_KERNEL_SIZE 9 + +#define PI 3.14159265 + class HessianDetector { public: @@ -35,9 +40,13 @@ bool detect(int kernelSize); void printPoints(); - vector<vector<int> > getPoints(); - vector<vector<int> > orderedList; //first n pixels with the largest determinant values + //clears memory of data structures that are not required anymore(before the description process) + void dump(); + vector<vector<int> >* getPoints(); + double getMaxima(int x, int y); + int getNrPoints(); + /* private slots: */ @@ -46,9 +55,11 @@ int nrPoints; 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 int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); + double _getScale(int kernelSize); int _convolutePixel(int* coordX, int* coordY, int* kernelSize); bool _boxFilterDetect(int kernelSize); bool _slidingWDetect(int kernelSize); Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-07-16 21:20:02 UTC (rev 2268) +++ gsoc07_featuredetection/main.cpp 2007-07-16 21:37:11 UTC (rev 2269) @@ -42,15 +42,16 @@ int main(int argc, char *argv[]) { + clock_t start,finish; double time; - int nrPoints=200; + int nrPoints=300; if(argc!=1) { cout << "Usage: ./main path_to_image" << "\n"; return 0; } - Image im("boat/img4.pgm"); + Image im("VanGoghRot/im4.pgm"); if(im.open()) { // cout << "Image opened!!!" << "\n"; } else { @@ -63,7 +64,6 @@ //cout << im.getRegionSum(2,2,4,4); - start = clock(); HessianDetector hd(&im,nrPoints, HD_BOX_FILTERS); @@ -71,7 +71,7 @@ cout << "Detection of points failed!"; return 1; } - //print points and display image with the detected points(only for debugging) + //print points and display image with the detected points(debugging only) //hd.printPoints(); finish = clock(); @@ -79,8 +79,8 @@ time = (double(finish)-double(start))/CLOCKS_PER_SEC; cout << "Measured time:"<<time<<"\n"; - Descriptor d(&im); - d.setPoints(&hd.orderedList); + Descriptor d(&im,&hd); + d.setPoints(hd.getPoints()); d.orientate(); return EXIT_SUCCESS; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-17 18:25:48
|
Revision: 2283 http://hugin.svn.sourceforge.net/hugin/?rev=2283&view=rev Author: stereo_sl Date: 2007-07-17 11:25:39 -0700 (Tue, 17 Jul 2007) Log Message: ----------- - added additional bins in the orientation assignment Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-17 17:57:31 UTC (rev 2282) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-17 18:25:39 UTC (rev 2283) @@ -47,12 +47,21 @@ int pointX; int pointY; - //double angles[NR_ANGLE_BINS]; - //double angles[NR_ANGLE_BINS][2]; - +/* +S0: if dx>0 and dy>0 and |dy|>|dx| +S1: if dx>0 and dy>0 and |dy|<=|dx| +S2: if dx>0 and dy<=0 and |dy|<=|dx| +S3: if dx>0 and dy<=0 and |dy|>|dx| +S4: if dx<=0 and dy<=0 and |dy|>|dx| +S5: if dx<=0 and dy<=0 and |dy|<=|dx| +S6: if dx<=0 and dy>0 and |dy|<=|dx| +S7: if dx<=0 and dy>0 and |dy|>|dx| + */ double Sx[NR_ANGLE_BINS]; double Sy[NR_ANGLE_BINS]; + + double dx; double dy; @@ -102,19 +111,39 @@ if(dx>0) { if(dy>0) { - Sx[0]+=dx; - Sy[0]+=dy; + if(fabs(dy)>fabs(dx)) { + Sx[0]+=dx; + Sy[0]+=dy; + } else { + Sx[1]+=dx; + Sy[1]+=dy; + } } else { - Sx[1]+=dx; - Sy[1]+=dy; + if(fabs(dy)<=fabs(dx)) { + Sx[2]+=dx; + Sy[2]+=dy; + } else { + Sx[3]+=dx; + Sy[3]+=dy; + } } } else { - if(dy>0) { - Sx[3]+=dx; - Sy[3]+=dy; + if(dy<=0) { + if(fabs(dy)>fabs(dx)) { + Sx[4]+=dx; + Sy[4]+=dy; + } else { + Sx[5]+=dx; + Sy[5]+=dy; + } } else { - Sx[2]+=dx; - Sy[2]+=dy; + if(fabs(dy)<=fabs(dx)) { + Sx[6]+=dx; + Sy[6]+=dy; + } else { + Sx[7]+=dx; + Sy[7]+=dy; + } } } Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-17 17:57:31 UTC (rev 2282) +++ gsoc07_featuredetection/Descriptor.h 2007-07-17 18:25:39 UTC (rev 2283) @@ -23,7 +23,7 @@ #include "Image.h" #include "HessianDetector.h" -#define NR_ANGLE_BINS 4 +#define NR_ANGLE_BINS 8 class Descriptor { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-18 22:34:51
|
Revision: 2291 http://hugin.svn.sourceforge.net/hugin/?rev=2291&view=rev Author: stereo_sl Date: 2007-07-18 15:34:48 -0700 (Wed, 18 Jul 2007) Log Message: ----------- - scale-space implementation with octaves and sampling Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-18 16:55:08 UTC (rev 2290) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-18 22:34:48 UTC (rev 2291) @@ -25,25 +25,21 @@ using namespace std; -HessianDetector::HessianDetector(Image* i, int nrPoints, CONVOLUTION_TYPE type) { - //cout << "constructor\n"; +HessianDetector::HessianDetector(Image* 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; this->nrPoints=nrPoints; + this->nrOctaves=octaves; this->convolutionType = type; + this->orderedList; + + //initialize the vectors determinants.resize(this->image->getHeightBW()); maximas.resize(this->image->getHeightBW()); - this->orderedList; - //initialize the vectors for(int i=0;i<this->image->getHeightBW();i++) { - /*if(i<nrPoints) { - orderedList[i].resize(3); - orderedList[i][0]=0; //x pixel value - orderedList[i][1]=0; //y pixel value - orderedList[i][2]=0; //det pixel value - }*/ maximas[i].resize(this->image->getWidthBW()); - determinants[i].resize(this->image->getWidthBW()); for(int j=0; j<this->image->getWidthBW();j++) { maximas[i][j] =0 ; @@ -52,20 +48,21 @@ } } -bool HessianDetector::detect(int kernelSize) { +bool HessianDetector::detect() { if(this->convolutionType==HD_BOX_FILTERS) { - return this->_boxFilterDetect(kernelSize); + return this->_boxFilterDetect(); } else if(this->convolutionType==HD_SLIDING_WINDOW) { - return this->_slidingWDetect(kernelSize); + return this->_slidingWDetect(); } } -bool HessianDetector::_slidingWDetect(int kernelSize) { +bool HessianDetector::_slidingWDetect() { int height = this->image->getHeightBW(); int width = this->image->getWidthBW(); int kernelX=9; int kernelY=9; + int kernelSize=9; double scale=1.2; int gxx[][9]={ @@ -222,20 +219,19 @@ return true; } -bool HessianDetector::_boxFilterDetect(int kernelSize) { +bool HessianDetector::_boxFilterDetect() { //cout << "started detecting"<< kernelSize <<"\n"; int height = this->image->getHeightBW(); int width = this->image->getWidthBW(); - for(int i=14;i<(height-14);i++) { - for(int j=14; j<(width-14);j++) { + for(int i=1;i<(height-1);i++) { + for(int j=1; j<(width-1);j++) { //calculate the determinants around the pixel, because of non-maxima suppression for(int k=-1;k<2;k++) { for(int l=-1; l<2;l++) { if(determinants[i+k][j+l]==-99999) { //if determinant for that pixel hasn't been set - determinants[i+k][j+l]=this->_convolutePixel(&i,&j,&kernelSize); - maximas[i+k][j+l]=_getScale(kernelSize); + _calculateMaxDet(i+k,j+l); //calculate it } } } @@ -257,17 +253,82 @@ determinants[i][j]>determinants[i+1][j+1] ) { this->_insertToList(&i,&j); } - //cout << determinants[i][j]<<"\n"; + cout << maximas[i][j]<<","<<determinants[i][j]<< " "; } + cout << "\n"; + } + return true; +} - //cout << "\n"; +void HessianDetector::_calculateMaxDet(int i, int j) { + /** + * Each octave has 4 kernel sizes. + */ + int octaves[][4] ={ + 9,15,21,27, + 15,27,39,51, + 21,45,69,93 + }; + double interp1; + double interp2; + + interp1=this->_convolutePixel(&i,&j,&octaves[0][0]); + + interp2=this->_convolutePixel(&i,&j,&octaves[0][1]); + if(interp1>interp2) { + this->determinants[i][j]=interp1; + this->maximas[i][j]=1.6; //scale of interpolation + + } else { + this->determinants[i][j]=interp2; + this->maximas[i][j]=3.2; //scale of interpolation + + } + + return; + + //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; + 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; + } 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 } - /*image->scale(scale); + //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(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; + } 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 + } + } + } - } //scale-space*/ - return true; + //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(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; + } 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 + } + } + } } + int HessianDetector::_getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int* pixelSumYY) { return *pixelSumXX*(*pixelSumYY)-pow((0.9*(*pixelSumXY)),2); } @@ -281,8 +342,8 @@ switch(*kernelSize) { case 9: //9x9 kernel - pixelSumXX=1*this->image->getRegionSum(*i-4,*j-2,*i-2,*j+2); - pixelSumXX+=1*this->image->getRegionSum(*i+2,*j-2,*i+4,*j+2); + 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); pixelSumXY=-1*this->image->getRegionSum(*i-3,*j+1,*i-1,*j+3); @@ -290,8 +351,8 @@ pixelSumXY+=1*this->image->getRegionSum(*i-3,*j-3,*i-1,*j-1); pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+3,*j+3); - pixelSumYY=1*this->image->getRegionSum(*i-2,*j-4,*i+2,*j-2); - pixelSumYY+=1*this->image->getRegionSum(*i-2,*j+2,*i+2,*j+4); + 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); //determinant of the Hessian Matrix @@ -329,7 +390,7 @@ pixelSumYY+=1*this->image->getRegionSum(*i-4,*j+3,*i+4,*j+7); pixelSumYY+=-2*this->image->getRegionSum(*i-4,*j-2,*i+4,*j+2); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/2.7778; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); break; case 17: //17x17 kernel @@ -346,7 +407,7 @@ pixelSumYY+=1*this->image->getRegionSum(*i-4,*j+3,*i+4,*j+8); pixelSumYY+=-2*this->image->getRegionSum(*i-4,*j-2,*i+4,*j+2); //determinant of the Hessian Matrix - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/3.56; break; case 21: //21x21 kernel @@ -372,7 +433,7 @@ pixelSumXX+=-2*this->image->getRegionSum(*i-4,*j-7,*i+4,*j+7); pixelSumXY=-1*this->image->getRegionSum(*i-9,*j+1,*i-1,*j+9); - pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-9,*i+7,*j-1); + pixelSumXY+=-1*this->image->getRegionSum(*i+1,*j-9,*i+9,*j-1); pixelSumXY+=1*this->image->getRegionSum(*i-9,*j-9,*i-1,*j-1); pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+9,*j+9); @@ -382,6 +443,93 @@ det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/9; break; + case 39: + //39x39 kernel + pixelSumXX=1*this->image->getRegionSum(*i-19,*j-11,*i-7,*j+11); + pixelSumXX+=1*this->image->getRegionSum(*i+7,*j-11,*i+19,*j+11); + pixelSumXX+=-2*this->image->getRegionSum(*i-6,*j-11,*i+6,*j+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+=1*this->image->getRegionSum(*i-13,*j-13,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+13,*j+13); + + pixelSumYY=1*this->image->getRegionSum(*i-11,*j-19,*i+11,*j-7); + pixelSumYY+=1*this->image->getRegionSum(*i-11,*j+7,*i+11,*j+19); + pixelSumYY+=-2*this->image->getRegionSum(*i-11,*j-6,*i+11,*j+6); + + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/19; + break; + case 45: + //45x45 kernel + pixelSumXX=1*this->image->getRegionSum(*i-22,*j-12,*i-8,*j+12); + pixelSumXX+=1*this->image->getRegionSum(*i+8,*j-12,*i+22,*j+12); + pixelSumXX+=-2*this->image->getRegionSum(*i-7,*j-12,*i+7,*j+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+=1*this->image->getRegionSum(*i-15,*j-15,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+15,*j+15); + + pixelSumYY=1*this->image->getRegionSum(*i-12,*j-22,*i+12,*j-8); + pixelSumYY+=1*this->image->getRegionSum(*i-12,*j+8,*i+12,*j+22); + pixelSumYY+=-2*this->image->getRegionSum(*i-12,*j-7,*i+12,*j+7); + + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/25; + break; + case 51: + //51x51 kernel + pixelSumXX=1*this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); + pixelSumXX+=1*this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); + pixelSumXX+=-2*this->image->getRegionSum(*i-8,*j-14,*i+8,*j+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+=1*this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + + pixelSumYY=1*this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); + pixelSumYY+=1*this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); + pixelSumYY+=-2*this->image->getRegionSum(*i-14,*j-8,*i+14,*j+8); + + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; + break; + case 69: +// TODO (zoran#1#): + //69x69 kernel + pixelSumXX=1*this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); + pixelSumXX+=1*this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); + pixelSumXX+=-2*this->image->getRegionSum(*i-8,*j-14,*i+8,*j+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+=1*this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + + pixelSumYY=1*this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); + pixelSumYY+=1*this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); + pixelSumYY+=-2*this->image->getRegionSum(*i-14,*j-8,*i+14,*j+8); + + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; + break; + case 93: +// TODO (zoran#1#): + //93x93 kernel + pixelSumXX=1*this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); + pixelSumXX+=1*this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); + pixelSumXX+=-2*this->image->getRegionSum(*i-8,*j-14,*i+8,*j+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+=1*this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); + pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + + pixelSumYY=1*this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); + pixelSumYY+=1*this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); + pixelSumYY+=-2*this->image->getRegionSum(*i-14,*j-8,*i+14,*j+8); + + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; + break; } return det; } @@ -434,7 +582,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]]/2); + this->image->drawCircle(tmp2[1],tmp2[0],maximas[tmp2[0]][tmp2[1]]*6); c++; //this->image->drawCircle(tmp2[1],tmp2[0],1); iter1++; Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-07-18 16:55:08 UTC (rev 2290) +++ gsoc07_featuredetection/HessianDetector.h 2007-07-18 22:34:48 UTC (rev 2291) @@ -27,6 +27,8 @@ #define CONVOLUTION_TYPE int #define HD_SLIDING_WINDOW 2 #define HD_BOX_FILTERS 1 +#define HD_MAX_OCTAVES 3 +#define HD_INITIAL_SCALE 1.2 //initial kernel size, representing scale 1.2 #define HD_INIT_KERNEL_SIZE 9 @@ -36,9 +38,9 @@ class HessianDetector { public: - HessianDetector(Image* i, int nrPoints=1000, CONVOLUTION_TYPE type=HD_BOX_FILTERS); + HessianDetector(Image* i, int nrPoints=1000, CONVOLUTION_TYPE type=HD_BOX_FILTERS, int nrOctaves=1); - bool detect(int kernelSize); + bool detect(); void printPoints(); //clears memory of data structures that are not required anymore(before the description process) @@ -53,16 +55,19 @@ private: Image* image; 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 int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY); + void _calculateMaxDet(int i, int j); //calculates scale-space maxima for pixel at coord i,j double _getScale(int kernelSize); int _convolutePixel(int* coordX, int* coordY, int* kernelSize); - bool _boxFilterDetect(int kernelSize); - bool _slidingWDetect(int kernelSize); + + bool _boxFilterDetect(); + bool _slidingWDetect(); void _insertToList(int* x, int* y); }; Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-07-18 16:55:08 UTC (rev 2290) +++ gsoc07_featuredetection/Image.cpp 2007-07-18 22:34:48 UTC (rev 2291) @@ -138,6 +138,8 @@ //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); } @@ -147,7 +149,7 @@ 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,0)); + cvLine(this->img,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,255,255)); } void Image::smooth() { @@ -174,14 +176,14 @@ return this->integral[x][y]; } int Image::getRegionSum(int x1, int y1, int x2, int y2) { - /*if(x1<=0) x1=1; + 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(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]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-19 21:35:51
|
Revision: 2293 http://hugin.svn.sourceforge.net/hugin/?rev=2293&view=rev Author: stereo_sl Date: 2007-07-19 13:31:48 -0700 (Thu, 19 Jul 2007) Log Message: ----------- - bug-fix: weighting of determinants was wrong Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/Image.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-19 17:03:18 UTC (rev 2292) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-19 20:31:48 UTC (rev 2293) @@ -221,11 +221,11 @@ bool HessianDetector::_boxFilterDetect() { //cout << "started detecting"<< kernelSize <<"\n"; - int height = this->image->getHeightBW(); - int width = this->image->getWidthBW(); + int height = this->image->getHeightBW()-1; + int width = this->image->getWidthBW()-1; - for(int i=1;i<(height-1);i++) { - for(int j=1; j<(width-1);j++) { + for(int i=1;i<height;i++) { + for(int j=1; j<width;j++) { //calculate the determinants around the pixel, because of non-maxima suppression for(int k=-1;k<2;k++) { @@ -253,9 +253,9 @@ determinants[i][j]>determinants[i+1][j+1] ) { this->_insertToList(&i,&j); } - cout << maximas[i][j]<<","<<determinants[i][j]<< " "; + //cout << maximas[i][j]<<","<<determinants[i][j]<< " "; } - cout << "\n"; + //cout << "\n"; } return true; } @@ -272,21 +272,6 @@ double interp1; double interp2; - interp1=this->_convolutePixel(&i,&j,&octaves[0][0]); - - interp2=this->_convolutePixel(&i,&j,&octaves[0][1]); - if(interp1>interp2) { - this->determinants[i][j]=interp1; - this->maximas[i][j]=1.6; //scale of interpolation - - } else { - this->determinants[i][j]=interp2; - this->maximas[i][j]=3.2; //scale of interpolation - - } - - return; - //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; @@ -348,8 +333,8 @@ 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+=1*this->image->getRegionSum(*i-3,*j-3,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+3,*j+3); + pixelSumXY+=this->image->getRegionSum(*i-3,*j-3,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+3,*j+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); @@ -360,154 +345,154 @@ break; case 11: //11x11 kernel - pixelSumXX=1*this->image->getRegionSum(*i-5,*j-3,*i-2,*j+3); - pixelSumXX+=1*this->image->getRegionSum(*i+2,*j-3,*i+5,*j+3); + 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); 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+=1*this->image->getRegionSum(*i-4,*j-4,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+4,*j+4); + pixelSumXY+=this->image->getRegionSum(*i-4,*j-4,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+4,*j+4); - pixelSumYY=1*this->image->getRegionSum(*i-3,*j-5,*i+3,*j-2); - pixelSumYY+=1*this->image->getRegionSum(*i-3,*j+2,*i+3,*j+5); + 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); //determinant of the Hessian Matrix - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/2.232; break; case 15: //15x15 kernel - pixelSumXX=1*this->image->getRegionSum(*i-7,*j-4,*i-3,*j+4); - pixelSumXX+=1*this->image->getRegionSum(*i+3,*j-4,*i+7,*j+4); + 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); 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+=1*this->image->getRegionSum(*i-5,*j-5,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+5,*j+5); + pixelSumXY+=this->image->getRegionSum(*i-5,*j-5,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+5,*j+5); - pixelSumYY=1*this->image->getRegionSum(*i-4,*j-7,*i+4,*j-3); - pixelSumYY+=1*this->image->getRegionSum(*i-4,*j+3,*i+4,*j+7); + 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); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY); + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/7.72; break; case 17: //17x17 kernel - pixelSumXX=1*this->image->getRegionSum(*i-8,*j-4,*i-3,*j+4); - pixelSumXX+=1*this->image->getRegionSum(*i+3,*j-4,*i+8,*j+4); + 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); 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+=1*this->image->getRegionSum(*i-6,*j-6,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+6,*j+6); + pixelSumXY+=this->image->getRegionSum(*i-6,*j-6,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+6,*j+6); - pixelSumYY=1*this->image->getRegionSum(*i-4,*j-8,*i+4,*j-3); - pixelSumYY+=1*this->image->getRegionSum(*i-4,*j+3,*i+4,*j+8); + 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); //determinant of the Hessian Matrix - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/3.56; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/12.73; break; case 21: //21x21 kernel - pixelSumXX=1*this->image->getRegionSum(*i-10,*j-6,*i-4,*j+6); - pixelSumXX+=1*this->image->getRegionSum(*i+4,*j-6,*i+10,*j+6); + 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); 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+=1*this->image->getRegionSum(*i-7,*j-7,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+7,*j+7); + pixelSumXY+=this->image->getRegionSum(*i-7,*j-7,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+7,*j+7); - pixelSumYY=1*this->image->getRegionSum(*i-6,*j-10,*i+6,*j-4); - pixelSumYY+=1*this->image->getRegionSum(*i-6,*j+4,*i+6,*j+10); + 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); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/5.4444; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/29.642; break; case 27: //27x27 kernel - pixelSumXX=1*this->image->getRegionSum(*i-13,*j-7,*i-5,*j+7); - pixelSumXX+=1*this->image->getRegionSum(*i+5,*j-7,*i+13,*j+7); + 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); 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+=1*this->image->getRegionSum(*i-9,*j-9,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+9,*j+9); + pixelSumXY+=this->image->getRegionSum(*i-9,*j-9,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+9,*j+9); - pixelSumYY=1*this->image->getRegionSum(*i-7,*j-13,*i+7,*j-5); - pixelSumYY+=1*this->image->getRegionSum(*i-7,*j+5,*i+7,*j+13); + 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); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/9; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/81; break; case 39: //39x39 kernel - pixelSumXX=1*this->image->getRegionSum(*i-19,*j-11,*i-7,*j+11); - pixelSumXX+=1*this->image->getRegionSum(*i+7,*j-11,*i+19,*j+11); + 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); 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+=1*this->image->getRegionSum(*i-13,*j-13,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+13,*j+13); + pixelSumXY+=this->image->getRegionSum(*i-13,*j-13,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+13,*j+13); - pixelSumYY=1*this->image->getRegionSum(*i-11,*j-19,*i+11,*j-7); - pixelSumYY+=1*this->image->getRegionSum(*i-11,*j+7,*i+11,*j+19); + 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); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/19; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/352.61; break; case 45: //45x45 kernel - pixelSumXX=1*this->image->getRegionSum(*i-22,*j-12,*i-8,*j+12); - pixelSumXX+=1*this->image->getRegionSum(*i+8,*j-12,*i+22,*j+12); + 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); 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+=1*this->image->getRegionSum(*i-15,*j-15,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+15,*j+15); + pixelSumXY+=this->image->getRegionSum(*i-15,*j-15,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+15,*j+15); - pixelSumYY=1*this->image->getRegionSum(*i-12,*j-22,*i+12,*j-8); - pixelSumYY+=1*this->image->getRegionSum(*i-12,*j+8,*i+12,*j+22); + 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); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/25; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/625; break; case 51: //51x51 kernel - pixelSumXX=1*this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); - pixelSumXX+=1*this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); + 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); 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+=1*this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + pixelSumXY+=this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); - pixelSumYY=1*this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); - pixelSumYY+=1*this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); + 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); - det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; + det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/1031.123; break; case 69: // TODO (zoran#1#): //69x69 kernel - pixelSumXX=1*this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); - pixelSumXX+=1*this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); + 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); 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+=1*this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + pixelSumXY+=this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); - pixelSumYY=1*this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); - pixelSumYY+=1*this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); + 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); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; @@ -515,17 +500,17 @@ case 93: // TODO (zoran#1#): //93x93 kernel - pixelSumXX=1*this->image->getRegionSum(*i-25,*j-14,*i-9,*j+14); - pixelSumXX+=1*this->image->getRegionSum(*i+9,*j-14,*i+25,*j+14); + 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); 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+=1*this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); - pixelSumXY+=1*this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); + pixelSumXY+=this->image->getRegionSum(*i-17,*j-17,*i-1,*j-1); + pixelSumXY+=this->image->getRegionSum(*i+1,*j+1,*i+17,*j+17); - pixelSumYY=1*this->image->getRegionSum(*i-14,*j-25,*i+14,*j-9); - pixelSumYY+=1*this->image->getRegionSum(*i-14,*j+9,*i+14,*j+25); + 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); det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; @@ -578,12 +563,12 @@ } void HessianDetector::printPoints() { vector<vector<int> >::iterator iter1 = orderedList.begin(); - int c=0; + //int c=0; 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]]*6); - c++; + this->image->drawCircle(tmp2[1],tmp2[0],maximas[tmp2[0]][tmp2[1]]*HD_INIT_KERNEL_SIZE); + //c++; //this->image->drawCircle(tmp2[1],tmp2[0],1); iter1++; } Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-07-19 17:03:18 UTC (rev 2292) +++ gsoc07_featuredetection/Image.cpp 2007-07-19 20:31:48 UTC (rev 2293) @@ -138,7 +138,7 @@ //cvReleaseImage( &img ); } void Image::drawCircle(int x,int y, int radius) { - cout << "Circle:" << x << "," << y << ",radius:"<<radius<<"\n"; + //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); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-25 21:36:50
|
Revision: 2329 http://hugin.svn.sourceforge.net/hugin/?rev=2329&view=rev Author: stereo_sl Date: 2007-07-25 14:36:48 -0700 (Wed, 25 Jul 2007) Log Message: ----------- - kernel bank for gabor filters used for the descriptor Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-25 21:25:58 UTC (rev 2328) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-25 21:36:48 UTC (rev 2329) @@ -184,3 +184,59 @@ double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); } +double* Descriptor::_getGaborResponse(int x,int y) { + double response[8]; +/** + * Gabor filter bank consists of 8 kernels. There are 4 orientations and 2 frequencies. + * Orientations: 0, 45, 90 and 135 degrees + * First frequency: bandwith 2, phase PI/2, aspect ratio 0.1, wavelength 5 + * Second frequency: bandwith 4, phase PI/2, aspect ratio 0.1, wavelength 10 + */ + //relative coordinates(from the center of the kernel) and weights + //for points of local maxima for first gabor filter(x,y,weight) + double gabor11[4][3]={ + -1,0,83.9304, + 1,0,-83.9304, + -3,0,-19.0826, + 3,0,19.0826, + }; + //second... + double gabor12[2][3]={ + -2,0,83.9304, + 2,0,-83.9304, + }; + + double gabor21[4][3]={ + -1,-1,76.2278, + -3,-2,-20.1919, + 2,3,20.1919, + 1,1,76.2278, + }; + double gabor22[2][3]={ + -2,-1,-84.4207, + 2,1,84.4207, + }; + + double gabor31[4][3]={ + 0,-1,83.9304, + 0,1,-83.9304, + 0,-3,-19.0826, + 0,3,19.0826, + }; + double gabor32[2][3]={ + 0,2,-83.9304, + 0,-2,83.9304, + }; + + double gabor41[4][3]={ + 1,-1,76.2278, + -2,+3,20.1919, + 2,-3,-20.1919, + -1,1,-76.2278, + }; + double gabor42[2][3]={ + -1,2,-84.4207, + 2,-1,84.4207, + }; + +} Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-25 21:25:58 UTC (rev 2328) +++ gsoc07_featuredetection/Descriptor.h 2007-07-25 21:36:48 UTC (rev 2329) @@ -30,7 +30,9 @@ public: Descriptor(Image* i, HessianDetector* hd); double _gaussWeighting(int x, int y, double stdev); + double* _getGaborResponse(int x,int y); + void setPoints(vector<vector<int> >* pts); void orientate(); @@ -41,6 +43,8 @@ double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); + + vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; int orientations[]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-26 23:12:37
|
Revision: 2334 http://hugin.svn.sourceforge.net/hugin/?rev=2334&view=rev Author: stereo_sl Date: 2007-07-26 16:12:33 -0700 (Thu, 26 Jul 2007) Log Message: ----------- - convolution for Gabor filters Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-26 19:54:34 UTC (rev 2333) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-26 23:12:33 UTC (rev 2334) @@ -184,8 +184,12 @@ double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); } -double* Descriptor::_getGaborResponse(int x,int y) { +double* Descriptor::_getGaborResponse(int x,int y, double maxima) { double response[8]; + + // + double factor = maxima/HD_INITIAL_SCALE; + /** * Gabor filter bank consists of 8 kernels. There are 4 orientations and 2 frequencies. * Orientations: 0, 45, 90 and 135 degrees @@ -239,4 +243,38 @@ 2,-1,84.4207, }; + //first frequency + for(int i=0; i<4;i++) { + response[0]+=this->image->getPixel(round(factor*(x+gabor11[i][0])),round(factor*(y+gabor11[i][1])))*gabor11[i][2]; + response[2]+=this->image->getPixel(round(factor*(x+gabor21[i][0])),round(factor*(y+gabor21[i][1])))*gabor21[i][2]; + response[4]+=this->image->getPixel(round(factor*(x+gabor31[i][0])),round(factor*(y+gabor31[i][1])))*gabor31[i][2]; + response[6]+=this->image->getPixel(round(factor*(x+gabor41[i][0])),round(factor*(y+gabor41[i][1])))*gabor41[i][2]; + } + for(int i=0; i<2;i++) { + response[1]+=this->image->getPixel(round(factor*(x+gabor12[i][0])),round(factor*(x+gabor12[i][1])))*gabor12[i][2]; + response[3]+=this->image->getPixel(round(factor*(x+gabor22[i][0])),round(factor*(x+gabor22[i][1])))*gabor22[i][2]; + response[5]+=this->image->getPixel(round(factor*(x+gabor32[i][0])),round(factor*(x+gabor32[i][1])))*gabor32[i][2]; + response[7]+=this->image->getPixel(round(factor*(x+gabor42[i][0])),round(factor*(x+gabor42[i][1])))*gabor42[i][2]; + } + return &response[0]; } + +void Descriptor::createDescriptors() { + + int regionSize; + + vector<vector<int> >::iterator iter1 = this->interestPoints->begin(); + while( iter1 != this->interestPoints->end()) { //loop over every interest point + vector<int > interestPoint=*iter1; + + regionSize=this->_getMaxima(interestPoint[0], interestPoint[1]); + + for(int i=(interestPoint[0]-regionSize);i<=(interestPoint[0]+regionSize);i++) { + for(int j=(interestPoint[1]-regionSize); j<=(interestPoint[1]+regionSize);j+=1) { + this->_getGaborResponse(interestPoint[0],interestPoint[1], this->_getMaxima(interestPoint[0], interestPoint[1])); + } + cout << "\n"; + } + + } +} Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-26 19:54:34 UTC (rev 2333) +++ gsoc07_featuredetection/Descriptor.h 2007-07-26 23:12:33 UTC (rev 2334) @@ -30,7 +30,7 @@ public: Descriptor(Image* i, HessianDetector* hd); double _gaussWeighting(int x, int y, double stdev); - double* _getGaborResponse(int x,int y); + double* _getGaborResponse(int x,int y,double maxima); void setPoints(vector<vector<int> >* pts); @@ -43,8 +43,8 @@ double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); + void createDescriptors(); - vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; int orientations[]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-27 21:46:58
|
Revision: 2345 http://hugin.svn.sourceforge.net/hugin/?rev=2345&view=rev Author: stereo_sl Date: 2007-07-27 14:46:56 -0700 (Fri, 27 Jul 2007) Log Message: ----------- - finished creation of descriptor(based on the region around the interest point) - shifting of the descriptor so that max element comes to first place(invariance to rotation) Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-27 18:24:19 UTC (rev 2344) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-27 21:46:56 UTC (rev 2345) @@ -184,9 +184,7 @@ double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); } -double* Descriptor::_getGaborResponse(int x,int y, double maxima) { - double response[8]; - +void Descriptor::_GaborResponse(int x,int y, double maxima, vector<double>* descriptor) { // double factor = maxima/HD_INITIAL_SCALE; @@ -245,18 +243,17 @@ //first frequency for(int i=0; i<4;i++) { - response[0]+=this->image->getPixel(round(factor*(x+gabor11[i][0])),round(factor*(y+gabor11[i][1])))*gabor11[i][2]; - response[2]+=this->image->getPixel(round(factor*(x+gabor21[i][0])),round(factor*(y+gabor21[i][1])))*gabor21[i][2]; - response[4]+=this->image->getPixel(round(factor*(x+gabor31[i][0])),round(factor*(y+gabor31[i][1])))*gabor31[i][2]; - response[6]+=this->image->getPixel(round(factor*(x+gabor41[i][0])),round(factor*(y+gabor41[i][1])))*gabor41[i][2]; + (*descriptor)[0]+=this->image->getPixel(round(factor*(x+gabor11[i][0])),round(factor*(y+gabor11[i][1])))*gabor11[i][2]; + (*descriptor)[2]+=this->image->getPixel(round(factor*(x+gabor21[i][0])),round(factor*(y+gabor21[i][1])))*gabor21[i][2]; + (*descriptor)[4]+=this->image->getPixel(round(factor*(x+gabor31[i][0])),round(factor*(y+gabor31[i][1])))*gabor31[i][2]; + (*descriptor)[6]+=this->image->getPixel(round(factor*(x+gabor41[i][0])),round(factor*(y+gabor41[i][1])))*gabor41[i][2]; } for(int i=0; i<2;i++) { - response[1]+=this->image->getPixel(round(factor*(x+gabor12[i][0])),round(factor*(x+gabor12[i][1])))*gabor12[i][2]; - response[3]+=this->image->getPixel(round(factor*(x+gabor22[i][0])),round(factor*(x+gabor22[i][1])))*gabor22[i][2]; - response[5]+=this->image->getPixel(round(factor*(x+gabor32[i][0])),round(factor*(x+gabor32[i][1])))*gabor32[i][2]; - response[7]+=this->image->getPixel(round(factor*(x+gabor42[i][0])),round(factor*(x+gabor42[i][1])))*gabor42[i][2]; + (*descriptor)[1]+=this->image->getPixel(round(factor*(x+gabor12[i][0])),round(factor*(x+gabor12[i][1])))*gabor12[i][2]; + (*descriptor)[3]+=this->image->getPixel(round(factor*(x+gabor22[i][0])),round(factor*(x+gabor22[i][1])))*gabor22[i][2]; + (*descriptor)[5]+=this->image->getPixel(round(factor*(x+gabor32[i][0])),round(factor*(x+gabor32[i][1])))*gabor32[i][2]; + (*descriptor)[7]+=this->image->getPixel(round(factor*(x+gabor42[i][0])),round(factor*(x+gabor42[i][1])))*gabor42[i][2]; } - return &response[0]; } void Descriptor::createDescriptors() { @@ -267,14 +264,41 @@ while( iter1 != this->interestPoints->end()) { //loop over every interest point vector<int > interestPoint=*iter1; + vector<double> descriptor; + descriptor.push_back(0); + descriptor.push_back(0); + descriptor.push_back(0); + descriptor.push_back(0); + descriptor.push_back(0); + descriptor.push_back(0); + descriptor.push_back(0); + descriptor.push_back(0); + regionSize=this->_getMaxima(interestPoint[0], interestPoint[1]); for(int i=(interestPoint[0]-regionSize);i<=(interestPoint[0]+regionSize);i++) { for(int j=(interestPoint[1]-regionSize); j<=(interestPoint[1]+regionSize);j+=1) { - this->_getGaborResponse(interestPoint[0],interestPoint[1], this->_getMaxima(interestPoint[0], interestPoint[1])); + this->_GaborResponse(interestPoint[0],interestPoint[1], this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor); } - cout << "\n"; + //cout << "\n"; } + //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); + } + this->descriptors.push_back(descriptor); } } Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-27 18:24:19 UTC (rev 2344) +++ gsoc07_featuredetection/Descriptor.h 2007-07-27 21:46:56 UTC (rev 2345) @@ -30,11 +30,12 @@ public: Descriptor(Image* i, HessianDetector* hd); double _gaussWeighting(int x, int y, double stdev); - double* _getGaborResponse(int x,int y,double maxima); + void setPoints(vector<vector<int> >* pts); void orientate(); + void createDescriptors(); private: Image* image; @@ -42,13 +43,12 @@ double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); + //double _initDescriptor(double* desciptor); + void _GaborResponse(int x,int y,double maxima,vector<double>* descriptor); - void createDescriptors(); - vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; + vector<vector<double> > descriptors; int orientations[]; - }; - - + }; #endif // DESCRIPTOR_H_INCLUDED Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-27 18:24:19 UTC (rev 2344) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-27 21:46:56 UTC (rev 2345) @@ -480,7 +480,7 @@ det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/1031.123; break; case 69: -// TODO (zoran#1#): +// 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); @@ -498,7 +498,7 @@ det=_getHessianDeterminant(&pixelSumXX,&pixelSumXY,&pixelSumYY)/32.1; break; case 93: -// TODO (zoran#1#): +// 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); Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-07-27 18:24:19 UTC (rev 2344) +++ gsoc07_featuredetection/main.cpp 2007-07-27 21:46:56 UTC (rev 2345) @@ -42,7 +42,6 @@ int main(int argc, char *argv[]) { - clock_t start,finish; double time; @@ -51,7 +50,7 @@ cout << "Usage: ./main path_to_image" << "\n"; return 0; } - Image im("VanGoghRot/im4.pgm"); + Image im("VanGoghRot/im13.pgm"); if(im.open()) { // cout << "Image opened!!!" << "\n"; } else { @@ -61,13 +60,12 @@ //need to integrate the image before the detection process(only if using box filter approximation) im.integrate(); - //cout << im.getRegionSum(2,2,4,4); start = clock(); - HessianDetector hd(&im,nrPoints, HD_BOX_FILTERS); - if(!hd.detect(9)) { + HessianDetector hd(&im,nrPoints, HD_BOX_FILTERS,1); + if(!hd.detect()) { cout << "Detection of points failed!"; return 1; } @@ -79,9 +77,10 @@ time = (double(finish)-double(start))/CLOCKS_PER_SEC; cout << "Measured time:"<<time<<"\n"; + Descriptor d(&im,&hd); d.setPoints(hd.getPoints()); - d.orientate(); - + //d.orientate(); + d.createDescriptors(); return EXIT_SUCCESS; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-28 21:53:30
|
Revision: 2346 http://hugin.svn.sourceforge.net/hugin/?rev=2346&view=rev Author: stereo_sl Date: 2007-07-28 14:53:28 -0700 (Sat, 28 Jul 2007) Log Message: ----------- Minor changes - function for calculating the difference between two descriptors Modified Paths: -------------- gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-07-27 21:46:56 UTC (rev 2345) +++ gsoc07_featuredetection/Descriptor.h 2007-07-28 21:53:28 UTC (rev 2346) @@ -23,7 +23,7 @@ #include "Image.h" #include "HessianDetector.h" -#define NR_ANGLE_BINS 8 +#define NR_ANGLE_BINS 8 class Descriptor { @@ -36,6 +36,7 @@ void setPoints(vector<vector<int> >* pts); void orientate(); void createDescriptors(); + vector<vector<double> >* getDescriptors(); private: Image* image; Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-07-27 21:46:56 UTC (rev 2345) +++ gsoc07_featuredetection/main.cpp 2007-07-28 21:53:28 UTC (rev 2346) @@ -39,6 +39,13 @@ using namespace std; +double getDistance(vector<double>* d1,vector<double>* d2) { +double dist=0; +for(int i=0; i<NR_ANGLE_BINS;i++) { + dist+=pow((*d1)[i]-(*d2)[i],2); +} +return dist; +} int main(int argc, char *argv[]) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-07-29 11:10:12
|
Revision: 2348 http://hugin.svn.sourceforge.net/hugin/?rev=2348&view=rev Author: stereo_sl Date: 2007-07-29 04:10:04 -0700 (Sun, 29 Jul 2007) Log Message: ----------- implemented matching of descriptors. Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-07-28 22:42:56 UTC (rev 2347) +++ gsoc07_featuredetection/Descriptor.cpp 2007-07-29 11:10:04 UTC (rev 2348) @@ -197,62 +197,63 @@ //relative coordinates(from the center of the kernel) and weights //for points of local maxima for first gabor filter(x,y,weight) double gabor11[4][3]={ - -1,0,83.9304, - 1,0,-83.9304, - -3,0,-19.0826, - 3,0,19.0826, + -1,0,0.839304, + 1,0,-0.839304, + -3,0,-0.190826, + 3,0,0.190826, }; //second... double gabor12[2][3]={ - -2,0,83.9304, - 2,0,-83.9304, + -2,0,0.839304, + 2,0,-0.839304, }; double gabor21[4][3]={ - -1,-1,76.2278, - -3,-2,-20.1919, - 2,3,20.1919, - 1,1,76.2278, + -1,-1,0.762278, + -3,-2,-0.201919, + 2,3,0.201919, + 1,1,0.762278, }; double gabor22[2][3]={ - -2,-1,-84.4207, - 2,1,84.4207, + -2,-1,-0.844207, + 2,1,0.844207, }; double gabor31[4][3]={ - 0,-1,83.9304, - 0,1,-83.9304, - 0,-3,-19.0826, - 0,3,19.0826, + 0,-1,0.839304, + 0,1,-0.839304, + 0,-3,-0.190826, + 0,3,0.190826, }; double gabor32[2][3]={ - 0,2,-83.9304, - 0,-2,83.9304, + 0,2,-0.839304, + 0,-2,0.839304, }; double gabor41[4][3]={ - 1,-1,76.2278, - -2,+3,20.1919, - 2,-3,-20.1919, - -1,1,-76.2278, + 1,-1,0.762278, + -2,+3,0.201919, + 2,-3,-0.201919, + -1,1,-0.762278, }; double gabor42[2][3]={ - -1,2,-84.4207, - 2,-1,84.4207, + -1,2,-0.844207, + 2,-1,0.844207, }; //first frequency - for(int i=0; i<4;i++) { - (*descriptor)[0]+=this->image->getPixel(round(factor*(x+gabor11[i][0])),round(factor*(y+gabor11[i][1])))*gabor11[i][2]; - (*descriptor)[2]+=this->image->getPixel(round(factor*(x+gabor21[i][0])),round(factor*(y+gabor21[i][1])))*gabor21[i][2]; - (*descriptor)[4]+=this->image->getPixel(round(factor*(x+gabor31[i][0])),round(factor*(y+gabor31[i][1])))*gabor31[i][2]; - (*descriptor)[6]+=this->image->getPixel(round(factor*(x+gabor41[i][0])),round(factor*(y+gabor41[i][1])))*gabor41[i][2]; + for(int i=0; i<4; 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]; } for(int i=0; i<2;i++) { - (*descriptor)[1]+=this->image->getPixel(round(factor*(x+gabor12[i][0])),round(factor*(x+gabor12[i][1])))*gabor12[i][2]; - (*descriptor)[3]+=this->image->getPixel(round(factor*(x+gabor22[i][0])),round(factor*(x+gabor22[i][1])))*gabor22[i][2]; - (*descriptor)[5]+=this->image->getPixel(round(factor*(x+gabor32[i][0])),round(factor*(x+gabor32[i][1])))*gabor32[i][2]; - (*descriptor)[7]+=this->image->getPixel(round(factor*(x+gabor42[i][0])),round(factor*(x+gabor42[i][1])))*gabor42[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]; } } @@ -274,17 +275,25 @@ descriptor.push_back(0); descriptor.push_back(0); - regionSize=this->_getMaxima(interestPoint[0], interestPoint[1]); + regionSize=3*this->_getMaxima(interestPoint[0], interestPoint[1]); - for(int i=(interestPoint[0]-regionSize);i<=(interestPoint[0]+regionSize);i++) { - for(int j=(interestPoint[1]-regionSize); j<=(interestPoint[1]+regionSize);j+=1) { - this->_GaborResponse(interestPoint[0],interestPoint[1], this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor); + int xStart=(interestPoint[0]-regionSize); + int xEnd=(interestPoint[0]+regionSize); + int yStart=(interestPoint[1]-regionSize); + int 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, 2*this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor); + } } //cout << "\n"; } //find the max element of the descriptor - int max=descriptor[0]; + /*int max=descriptor[0]; int maxId=0; for(int i=1;i<8;i++) { if(descriptor[i]>max) { @@ -298,7 +307,11 @@ int tmp=descriptor[0]; descriptor.erase(descriptor.begin()); descriptor.push_back(tmp); - } + }*/ this->descriptors.push_back(descriptor); + iter1++; } } +vector<vector<double> >* Descriptor::getDescriptors() { + return &this->descriptors; +} Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-07-28 22:42:56 UTC (rev 2347) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-07-29 11:10:04 UTC (rev 2348) @@ -224,9 +224,12 @@ int height = this->image->getHeightBW()-1; int width = this->image->getWidthBW()-1; - for(int i=1;i<height;i++) { - for(int j=1; j<width;j++) { + int xEnd=height-50; + int yEnd=width-50; + for(int i=50;i<xEnd;i++) { + for(int j=50; j<yEnd;j++) { + //calculate the determinants around the pixel, because of non-maxima suppression for(int k=-1;k<2;k++) { for(int l=-1; l<2;l++) { Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-07-28 22:42:56 UTC (rev 2347) +++ gsoc07_featuredetection/main.cpp 2007-07-29 11:10:04 UTC (rev 2348) @@ -39,6 +39,7 @@ using namespace std; + double getDistance(vector<double>* d1,vector<double>* d2) { double dist=0; for(int i=0; i<NR_ANGLE_BINS;i++) { @@ -52,42 +53,107 @@ clock_t start,finish; double time; - int nrPoints=300; + int nrPoints=150; if(argc!=1) { cout << "Usage: ./main path_to_image" << "\n"; return 0; } - Image im("VanGoghRot/im13.pgm"); - if(im.open()) { - // cout << "Image opened!!!" << "\n"; - } else { + Image im1("test1.jpg"); + if(!im1.open()) { cout<< "Error! Image can not be opened"<<"\n"; return 0; } + Image im2("test2.jpg"); + 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) - im.integrate(); - //cout << im.getRegionSum(2,2,4,4); + im1.integrate(); + im2.integrate(); start = clock(); - HessianDetector hd(&im,nrPoints, HD_BOX_FILTERS,1); - if(!hd.detect()) { + 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) - //hd.printPoints(); + //hd1.printPoints(); finish = clock(); time = (double(finish)-double(start))/CLOCKS_PER_SEC; cout << "Measured time:"<<time<<"\n"; + vector<vector<int> >* interestPoints1=hd1.getPoints(); - Descriptor d(&im,&hd); - d.setPoints(hd.getPoints()); + Descriptor d1(&im1,&hd1); + d1.setPoints(interestPoints1); //d.orientate(); - d.createDescriptors(); + d1.createDescriptors(); + + 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(); + + + vector<vector<int> >* interestPoints2=hd2.getPoints(); + + Descriptor d2(&im2,&hd2); + d2.setPoints(interestPoints2); + //d.orientate(); + d2.createDescriptors(); + + vector<vector<double> >* descriptors1=d1.getDescriptors(); + vector<vector<double> >::iterator iter1 = (*descriptors1).begin(); + + + vector<vector<double> >* descriptors2=d2.getDescriptors(); + + int pointCount=0; + + while( iter1 != (*descriptors1).end()) { + + vector<double> current1 = *iter1; + + vector<vector<double> >::iterator iter2 =(*descriptors2).begin(); + + int max=1; + int maxId=0; + vector<double> current2 = *iter2; + + double distance=getDistance(¤t1,¤t2); + iter2++; + double diff=distance; + + while( iter2 != (*descriptors2).end()) { + current2 = *iter2; + distance=getDistance(¤t1,¤t2); + if(distance<diff) { + diff=distance; + maxId=max; + } + max++; + + iter2++; + } + cout << diff<< "\n"; + if(diff<1000000) { //print corresponding points + im1.drawCircle((*interestPoints1)[pointCount][1],(*interestPoints1)[pointCount][0],10); + im2.drawCircle((*interestPoints2)[maxId][1],(*interestPoints2)[maxId][0],10); + } + iter1++; + pointCount++; + } + im1.show(); + im2.show(); return EXIT_SUCCESS; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-10 12:06:29
|
Revision: 2369 http://hugin.svn.sourceforge.net/hugin/?rev=2369&view=rev Author: stereo_sl Date: 2007-08-10 05:06:27 -0700 (Fri, 10 Aug 2007) Log Message: ----------- - extended the descriptor to 64 elements - additional points of local maxima for gabor filter Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-09 21:37:35 UTC (rev 2368) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-10 12:06:27 UTC (rev 2369) @@ -184,18 +184,18 @@ double Descriptor::_euclidianDistance(int x1, int y1, int x2, int y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); } -void Descriptor::_GaborResponse(int x,int y, double maxima, vector<double>* descriptor) { +void Descriptor::_GaborResponse(int x,int y, double maxima, double* descriptor) { // double factor = maxima/HD_INITIAL_SCALE; /*vector<int> d=*descriptor; d[0]++;*/ - /** * Gabor filter bank consists of 8 kernels. There are 4 orientations and 2 frequencies. * Orientations: 0, 45, 90 and 135 degrees * First frequency: bandwith 2, phase PI/2, aspect ratio 0.1, wavelength 5 * Second frequency: bandwith 4, phase PI/2, aspect ratio 0.1, wavelength 10 + * Third frequency: bandwith 6, phase PI/2, aspect ratio 0.1, wavelength 8 */ //relative coordinates(from the center of the kernel) and weights //for points of local maxima for first gabor filter(x,y,weight) @@ -207,7 +207,7 @@ -6,0,0.0105653, 6,0,-0.0105653 }; - //second... + //second...orientation=0, wavelength=10 double gabor12[6][3]={ -2,0,0.839304, 2,0,-0.839304, @@ -217,6 +217,20 @@ 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 + }; + + //orientation=PI/4, wavelength=5 double gabor21[6][3]={ -1,-1,0.762278, -3,-2,-0.201919, @@ -225,6 +239,8 @@ 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, @@ -234,6 +250,19 @@ 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 + }; + double gabor31[6][3]={ 0,-1,0.839304, 0,1,-0.839304, @@ -250,6 +279,18 @@ 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 + }; double gabor41[6][3]={ 1,-1,0.762278, @@ -257,7 +298,7 @@ 2,-3,-0.201919, -1,1,-0.762278, 3,-5,0.0134254, - -3,5,-0.0134254, + -3,5,-0.0134254 }; double gabor42[6][3]={ -1,2,-0.844207, @@ -265,22 +306,102 @@ 4,-5,-0.213173, -5,4,0.213173, 8,-8,0.013459, - -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 + }; - //first frequency - for(int i=0; i<4; i++) { + //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 + }; - (*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]; + //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 + }; + + //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 + }; + + //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 + }; + + 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[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]; + } - for(int i=0; i<2;i++) { - (*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]; + 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[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]; + } } @@ -292,34 +413,71 @@ while( iter1 != this->interestPoints->end()) { //loop over every interest point vector<int > interestPoint=*iter1; - vector<double> descriptor; + for(int i=0;i<DESCRIPTOR_SIZE;i++) { descriptor.push_back(0); - descriptor.push_back(0); - descriptor.push_back(0); - descriptor.push_back(0); - descriptor.push_back(0); - descriptor.push_back(0); - descriptor.push_back(0); - descriptor.push_back(0); + } - regionSize=3*this->_getMaxima(interestPoint[0], interestPoint[1]); + regionSize=round(4*this->_getMaxima(interestPoint[0], interestPoint[1])); int xStart=(interestPoint[0]-regionSize); - int xEnd=(interestPoint[0]+regionSize); + int xEnd=(interestPoint[0]); int yStart=(interestPoint[1]-regionSize); - int yEnd=(interestPoint[1]+regionSize); + int yEnd=(interestPoint[1]); + //first subregion 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, 2*this->_getMaxima(interestPoint[0], interestPoint[1]),&descriptor); - } + //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]); + //} } //cout << "\n"; } + xStart=(interestPoint[0]-regionSize); + xEnd=(interestPoint[0]); + 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[7]); + //} + } + //cout << "\n"; + } + + xStart=(interestPoint[0]); + xEnd=(interestPoint[0]+regionSize); + yStart=(interestPoint[1]-regionSize); + yEnd=(interestPoint[1]); + 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[15]); + //} + } + //cout << "\n"; + } + + 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[23]); + //} + } + //cout << "\n"; + } + //find the max element of the descriptor /*int max=descriptor[0]; int maxId=0; Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-08-09 21:37:35 UTC (rev 2368) +++ gsoc07_featuredetection/Descriptor.h 2007-08-10 12:06:27 UTC (rev 2369) @@ -24,6 +24,7 @@ #include "HessianDetector.h" #define NR_ANGLE_BINS 8 +#define DESCRIPTOR_SIZE 64 class Descriptor { @@ -45,7 +46,7 @@ double _getMaxima(int x,int y); double _euclidianDistance(int x1, int y1, int x2, int y2); //double _initDescriptor(double* desciptor); - void _GaborResponse(int x,int y,double maxima,vector<double>* descriptor); + void _GaborResponse(int x,int y,double maxima,double* descriptor); vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-09 21:37:35 UTC (rev 2368) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-10 12:06:27 UTC (rev 2369) @@ -224,11 +224,11 @@ int height = this->image->getHeightBW()-1; int width = this->image->getWidthBW()-1; - int xEnd=height-50; - int yEnd=width-50; + int xEnd=height-60; + int yEnd=width-60; - for(int i=50;i<xEnd;i++) { - for(int j=50; j<yEnd;j++) { + for(int i=60;i<xEnd;i++) { + for(int j=60; j<yEnd;j++) { //calculate the determinants around the pixel, because of non-maxima suppression for(int k=-1;k<2;k++) { Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-08-09 21:37:35 UTC (rev 2368) +++ gsoc07_featuredetection/main.cpp 2007-08-10 12:06:27 UTC (rev 2369) @@ -42,7 +42,7 @@ double getDistance(vector<double>* d1,vector<double>* d2) { double dist=0; -for(int i=0; i<NR_ANGLE_BINS;i++) { +for(int i=0; i<DESCRIPTOR_SIZE;i++) { dist+=pow((*d1)[i]-(*d2)[i],2); } return dist; @@ -53,7 +53,7 @@ clock_t start,finish; double time; - int nrPoints=150; + int nrPoints=250; if(argc!=1) { cout << "Usage: ./main path_to_image" << "\n"; return 0; @@ -146,7 +146,7 @@ iter2++; } cout << diff<< "\n"; - if(diff<1000000) { //print corresponding points + if(diff<5000000) { //print corresponding points im1.drawCircle((*interestPoints1)[pointCount][1],(*interestPoints1)[pointCount][0],10); im2.drawCircle((*interestPoints2)[maxId][1],(*interestPoints2)[maxId][0],10); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-11 10:25:43
|
Revision: 2370 http://hugin.svn.sourceforge.net/hugin/?rev=2370&view=rev Author: stereo_sl Date: 2007-08-11 03:25:40 -0700 (Sat, 11 Aug 2007) Log Message: ----------- - improved matching of descriptors using second nearest neighbour ratio Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/main.cpp Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-10 12:06:27 UTC (rev 2369) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-11 10:25:40 UTC (rev 2370) @@ -21,6 +21,7 @@ #include <iostream> #include <stdlib.h> #include <math.h> +#include <limits> #include "HessianDetector.h" using namespace std; @@ -38,12 +39,13 @@ determinants.resize(this->image->getHeightBW()); maximas.resize(this->image->getHeightBW()); + 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++) { maximas[i][j] =0 ; - determinants[i][j]=-99999; + determinants[i][j]=iMax; } } } @@ -224,6 +226,8 @@ int height = this->image->getHeightBW()-1; int width = this->image->getWidthBW()-1; + const int iMax=std::numeric_limits<int>::max(); + int xEnd=height-60; int yEnd=width-60; @@ -233,7 +237,7 @@ //calculate the determinants around the pixel, because of non-maxima suppression for(int k=-1;k<2;k++) { for(int l=-1; l<2;l++) { - if(determinants[i+k][j+l]==-99999) { //if determinant for that pixel hasn't been set + if(determinants[i+k][j+l]==iMax) { //if determinant for that pixel hasn't been set _calculateMaxDet(i+k,j+l); //calculate it } } Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-08-10 12:06:27 UTC (rev 2369) +++ gsoc07_featuredetection/main.cpp 2007-08-11 10:25:40 UTC (rev 2370) @@ -36,6 +36,7 @@ #include "Image.h" #include "HessianDetector.h" #include "Descriptor.h" +#include <limits> using namespace std; @@ -115,41 +116,47 @@ vector<vector<double> >* descriptors1=d1.getDescriptors(); vector<vector<double> >::iterator iter1 = (*descriptors1).begin(); - vector<vector<double> >* descriptors2=d2.getDescriptors(); int pointCount=0; + int max; + int maxId; //position int the vector of the nearest neighbour while( iter1 != (*descriptors1).end()) { - vector<double> current1 = *iter1; vector<vector<double> >::iterator iter2 =(*descriptors2).begin(); - int max=1; - int maxId=0; + max=1; + maxId=0; + vector<double> current2 = *iter2; double distance=getDistance(¤t1,¤t2); iter2++; - double diff=distance; + 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++; } - cout << diff<< "\n"; - if(diff<5000000) { //print corresponding points - im1.drawCircle((*interestPoints1)[pointCount][1],(*interestPoints1)[pointCount][0],10); - im2.drawCircle((*interestPoints2)[maxId][1],(*interestPoints2)[maxId][0],10); + if(diff<(0.5*diff2)) { + im1.drawCircle((*interestPoints1)[pointCount][1],(*interestPoints1)[pointCount][0],10); + im2.drawCircle((*interestPoints2)[maxId][1],(*interestPoints2)[maxId][0],10); } + iter1++; pointCount++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-08-12 23:46:50
|
Revision: 2371 http://hugin.svn.sourceforge.net/hugin/?rev=2371&view=rev Author: dangelo Date: 2007-08-12 16:46:48 -0700 (Sun, 12 Aug 2007) Log Message: ----------- - updated cmake scripts, to allow compilation - added functions and program to output data required for detector comparison script Modified Paths: -------------- gsoc07_featuredetection/CMakeLists.txt gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/HessianDetector.h gsoc07_featuredetection/Image.h gsoc07_featuredetection/main.cpp Added Paths: ----------- gsoc07_featuredetection/runDetDesc.cpp Modified: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/CMakeLists.txt 2007-08-12 23:46:48 UTC (rev 2371) @@ -4,12 +4,20 @@ #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}) + #add definitions, compiler switches, etc. -ADD_DEFINITIONS(-Wall -O2) +ADD_DEFINITIONS(-Wall -O2 -g) #list all source files here -ADD_EXECUTABLE(opencv main.cpp) - +ADD_EXECUTABLE(main main.cpp Image.cpp HessianDetector.cpp Descriptor.cpp) #need to link to some other libraries ? just add them here -#TARGET_LINK_LIBRARIES(opencv png jpeg) +TARGET_LINK_LIBRARIES(main highgui cv cxcore png jpeg) +#list all source files here +ADD_EXECUTABLE(runDetDesc runDetDesc.cpp Image.cpp HessianDetector.cpp Descriptor.cpp) +#need to link to some other libraries ? just add them here +TARGET_LINK_LIBRARIES(runDetDesc highgui cv cxcore png jpeg) + Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-12 23:46:48 UTC (rev 2371) @@ -498,6 +498,30 @@ iter1++; } } + vector<vector<double> >* Descriptor::getDescriptors() { return &this->descriptors; } + + +void Descriptor::printDescriptors(std::ostream & o) +{ + 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 = 1; + 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++; + } +} + Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/Descriptor.h 2007-08-12 23:46:48 UTC (rev 2371) @@ -38,6 +38,7 @@ void orientate(); void createDescriptors(); vector<vector<double> >* getDescriptors(); + void printDescriptors(std::ostream & o); private: Image* image; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-12 23:46:48 UTC (rev 2371) @@ -582,6 +582,26 @@ this->image->show(); //cout << c <<"\n"; } + +void HessianDetector::printPoints(std::ostream & o) { + vector<vector<int> >::iterator iter1 = orderedList.begin(); + int n=0; + while( iter1 != orderedList.end()) { + n++; + iter1++; + } + o << 1 << endl; + o << n << endl; + iter1 = orderedList.begin(); + //int c=0; + while( iter1 != orderedList.end()) { + vector<int > tmp2=*iter1; + double r = maximas[tmp2[0]][tmp2[1]]*HD_INIT_KERNEL_SIZE; + o <<tmp2[1]<<" "<<tmp2[0]<<" "<< " " << 1/(r*r) << " " << 0 << " " << 1/(r*r) << endl; + iter1++; + } +} + vector<vector<int> >* HessianDetector::getPoints() { return &this->orderedList; } Modified: gsoc07_featuredetection/HessianDetector.h =================================================================== --- gsoc07_featuredetection/HessianDetector.h 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/HessianDetector.h 2007-08-12 23:46:48 UTC (rev 2371) @@ -42,6 +42,7 @@ bool detect(); void printPoints(); + void printPoints(std::ostream & o); //clears memory of data structures that are not required anymore(before the description process) void dump(); Modified: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/Image.h 2007-08-12 23:46:48 UTC (rev 2371) @@ -23,7 +23,7 @@ #include <stdio.h> #include <iostream> #include <stdlib.h> -#include <vector.h> +#include <vector> #include "cv.h" /*#include "vigra/stdimage.hxx" #include "vigra/impex.hxx"*/ Modified: gsoc07_featuredetection/main.cpp =================================================================== --- gsoc07_featuredetection/main.cpp 2007-08-11 10:25:40 UTC (rev 2370) +++ gsoc07_featuredetection/main.cpp 2007-08-12 23:46:48 UTC (rev 2371) @@ -55,17 +55,17 @@ double time; int nrPoints=250; - if(argc!=1) { - cout << "Usage: ./main path_to_image" << "\n"; + if(argc!=3) { + cout << "Usage: ./main img1 img2 " << "\n"; return 0; } - Image im1("test1.jpg"); + Image im1(argv[1]); if(!im1.open()) { cout<< "Error! Image can not be opened"<<"\n"; return 0; } - Image im2("test2.jpg"); + Image im2(argv[2]); if(!im2.open()) { cout<< "Error! Image can not be opened"<<"\n"; return 0; Added: gsoc07_featuredetection/runDetDesc.cpp =================================================================== --- gsoc07_featuredetection/runDetDesc.cpp (rev 0) +++ gsoc07_featuredetection/runDetDesc.cpp 2007-08-12 23:46:48 UTC (rev 2371) @@ -0,0 +1,95 @@ +/*************************************************************************** + * 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 1 +//#define USE_VIGRA 1 + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <iostream> +#include <fstream> +#include <stdlib.h> +#include <math.h> +#include <ctime> +#include <algorithm> + +#include <string> +#include "Image.h" +#include "HessianDetector.h" +#include "Descriptor.h" +#include <limits> + +using namespace std; + + +int main(int argc, char *argv[]) +{ + + clock_t start,finish; + double time; + + int nrPoints=1000; + if(argc<3) { + cout << "Usage: runDetDesc inputImg interestPoints.txt [descriptors.txt]" << "\n"; + return 0; + } + + Image im1(argv[1]); + if(!im1.open()) { + cout<< "Error! Image can not be opened"<<"\n"; + return 0; + } + start = clock(); + //need to integrate the image before the detection process(only if using box filter approximation) + im1.integrate(); + + HessianDetector hd1(&im1,nrPoints, HD_BOX_FILTERS,1); + if(!hd1.detect()) { + cout << "Detection of points failed!"; + return 1; + } + finish = clock(); + time = (double(finish)-double(start))/CLOCKS_PER_SEC; + cout << "Extracted " << nrPoints << " interest points, time:"<<time<<"\n"; + + //print points and display image with the detected points(debugging only) + std::ofstream output(argv[2]); + hd1.printPoints(output); + + if (argc > 3) { + start = clock(); + vector<vector<int> >* interestPoints1=hd1.getPoints(); + + Descriptor d1(&im1,&hd1); + d1.setPoints(interestPoints1); + //d.orientate(); + d1.createDescriptors(); + finish = clock(); + time = (double(finish)-double(start))/CLOCKS_PER_SEC; + cout << "Extracted descriptors, time:"<<time<<"\n"; + + std::ofstream output2(argv[3]); + d1.printDescriptors(output2); + } +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-08-13 17:38:56
|
Revision: 2373 http://hugin.svn.sourceforge.net/hugin/?rev=2373&view=rev Author: dangelo Date: 2007-08-13 10:38:52 -0700 (Mon, 13 Aug 2007) Log Message: ----------- improved the runDetDesc executable. Compatible to surf and the other detectors/descriptors available. Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/HessianDetector.cpp gsoc07_featuredetection/runDetDesc.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-13 17:23:37 UTC (rev 2372) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-13 17:38:52 UTC (rev 2373) @@ -514,7 +514,7 @@ //int c=0; while( iter1 != interestPoints->end()) { vector<int > tmp2=*iter1; - double r = 1; + 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 << " "; Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-13 17:23:37 UTC (rev 2372) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-13 17:38:52 UTC (rev 2373) @@ -596,7 +596,7 @@ //int c=0; while( iter1 != orderedList.end()) { vector<int > tmp2=*iter1; - double r = maximas[tmp2[0]][tmp2[1]]*HD_INIT_KERNEL_SIZE; + double r = getMaxima(tmp2[0], tmp2[1])*HD_INIT_KERNEL_SIZE; o <<tmp2[1]<<" "<<tmp2[0]<<" "<< " " << 1/(r*r) << " " << 0 << " " << 1/(r*r) << endl; iter1++; } Modified: gsoc07_featuredetection/runDetDesc.cpp =================================================================== --- gsoc07_featuredetection/runDetDesc.cpp 2007-08-13 17:23:37 UTC (rev 2372) +++ gsoc07_featuredetection/runDetDesc.cpp 2007-08-13 17:38:52 UTC (rev 2373) @@ -41,22 +41,57 @@ using namespace std; +void usage() +{ + cout << "runDetDesc: run feature detection and extraction" << endl + << endl + << "Usage: runDetDesc [options] -i input.pgm -o output.txt" << endl + << "Options:" << endl + << " -i input.pgm Input image" << endl + << " -o output.txt output file with interest points and descriptors" << endl + << " -n num Extract num interest points an descriptors" << endl + << " TODO: replace with threshold, default 1000" << endl + << endl; +} + int main(int argc, char *argv[]) { + const char * optstring = "hi:o:n:"; + char c; clock_t start,finish; double time; - int nrPoints=1000; - if(argc<3) { - cout << "Usage: runDetDesc inputImg interestPoints.txt [descriptors.txt]" << "\n"; - return 0; + std::string input; + std::string output; + int nrPoints = 1000; + + // parse arguments + while ((c = getopt (argc, argv, optstring)) != -1) + { + switch(c) { + case 'i': + input = optarg; + break; + case 'o': + output = optarg; + break; + case 'n': + nrPoints = atoi(optarg); + break; + case 'h': + usage(); + return 0; + break; + default: + abort(); + } } - Image im1(argv[1]); + Image im1(input); if(!im1.open()) { - cout<< "Error! Image can not be opened"<<"\n"; + cout<< "Error! Image " << input << "can not be opened"<<"\n"; return 0; } start = clock(); @@ -65,31 +100,25 @@ HessianDetector hd1(&im1,nrPoints, HD_BOX_FILTERS,1); if(!hd1.detect()) { - cout << "Detection of points failed!"; - return 1; + cout << "Detection of points failed!"; + return 1; } finish = clock(); time = (double(finish)-double(start))/CLOCKS_PER_SEC; cout << "Extracted " << nrPoints << " interest points, time:"<<time<<"\n"; - //print points and display image with the detected points(debugging only) - std::ofstream output(argv[2]); - hd1.printPoints(output); + start = clock(); + vector<vector<int> >* interestPoints1=hd1.getPoints(); - if (argc > 3) { - start = clock(); - vector<vector<int> >* interestPoints1=hd1.getPoints(); + Descriptor d1(&im1,&hd1); + d1.setPoints(interestPoints1); + //d.orientate(); + d1.createDescriptors(); + finish = clock(); + time = (double(finish)-double(start))/CLOCKS_PER_SEC; + cout << "Extracted descriptors, time:"<<time<<"\n"; - Descriptor d1(&im1,&hd1); - d1.setPoints(interestPoints1); - //d.orientate(); - d1.createDescriptors(); - finish = clock(); - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - cout << "Extracted descriptors, time:"<<time<<"\n"; - - std::ofstream output2(argv[3]); - d1.printDescriptors(output2); - } + std::ofstream output2(output.c_str()); + d1.printDescriptors(output2); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-15 10:17:28
|
Revision: 2392 http://hugin.svn.sourceforge.net/hugin/?rev=2392&view=rev Author: stereo_sl Date: 2007-08-15 03:17:16 -0700 (Wed, 15 Aug 2007) Log Message: ----------- - increased the descriptor size to 96 elements Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/HessianDetector.cpp Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-14 09:06:25 UTC (rev 2391) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-15 10:17:16 UTC (rev 2392) @@ -377,6 +377,172 @@ -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 + }; + + //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, + }; + //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 + }; + + //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 + }; + + 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 + }; + + //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 + }; + + //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 + }; + + 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 + }; + + 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]; @@ -401,7 +567,19 @@ 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]; + } + 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[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]; + } } @@ -418,7 +596,7 @@ descriptor.push_back(0); } - regionSize=round(4*this->_getMaxima(interestPoint[0], interestPoint[1])); + regionSize=round(8*this->_getMaxima(interestPoint[0], interestPoint[1])); int xStart=(interestPoint[0]-regionSize); int xEnd=(interestPoint[0]); @@ -431,6 +609,7 @@ //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"; @@ -444,7 +623,8 @@ 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[7]); + 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"; @@ -458,7 +638,8 @@ 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[15]); + 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"; @@ -472,7 +653,8 @@ 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[23]); + 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"; @@ -498,19 +680,16 @@ iter1++; } } - vector<vector<double> >* Descriptor::getDescriptors() { return &this->descriptors; } - - void Descriptor::printDescriptors(std::ostream & o) { 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; Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-08-14 09:06:25 UTC (rev 2391) +++ gsoc07_featuredetection/Descriptor.h 2007-08-15 10:17:16 UTC (rev 2392) @@ -18,13 +18,13 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef DESCRIPTOR_H_INCLUDED -#define DESCRIPTOR_H_INCLUDED +#ifndef DESCRIPTOR_H_INCLUDED +#define DESCRIPTOR_H_INCLUDED #include "Image.h" #include "HessianDetector.h" #define NR_ANGLE_BINS 8 -#define DESCRIPTOR_SIZE 64 +#define DESCRIPTOR_SIZE 96 class Descriptor { @@ -53,5 +53,5 @@ vector<vector<int> >* maximas; vector<vector<double> > descriptors; int orientations[]; - }; -#endif // DESCRIPTOR_H_INCLUDED + }; +#endif // DESCRIPTOR_H_INCLUDED Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-14 09:06:25 UTC (rev 2391) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-15 10:17:16 UTC (rev 2392) @@ -228,11 +228,14 @@ const int iMax=std::numeric_limits<int>::max(); - int xEnd=height-60; - int yEnd=width-60; + //TODO: + //leave out pixels close to the edge; number of left-out pixels + //vary according to image size + int xEnd=height-80; + int yEnd=width-80; - for(int i=60;i<xEnd;i++) { - for(int j=60; j<yEnd;j++) { + for(int i=80;i<xEnd;i++) { + for(int j=80; j<yEnd;j++) { //calculate the determinants around the pixel, because of non-maxima suppression for(int k=-1;k<2;k++) { @@ -582,7 +585,6 @@ this->image->show(); //cout << c <<"\n"; } - void HessianDetector::printPoints(std::ostream & o) { vector<vector<int> >::iterator iter1 = orderedList.begin(); int n=0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-16 21:47:49
|
Revision: 2393 http://hugin.svn.sourceforge.net/hugin/?rev=2393&view=rev Author: stereo_sl Date: 2007-08-16 14:47:47 -0700 (Thu, 16 Aug 2007) Log Message: ----------- - layout and definition for FeatureMatcher class - changes to the offset in the detector Modified Paths: -------------- gsoc07_featuredetection/HessianDetector.cpp Added Paths: ----------- gsoc07_featuredetection/FeatureMatcher.cpp gsoc07_featuredetection/FeatureMatcher.h Added: gsoc07_featuredetection/FeatureMatcher.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatcher.cpp (rev 0) +++ gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-16 21:47:47 UTC (rev 2393) @@ -0,0 +1,19 @@ +/*************************************************************************** + * 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. * + ***************************************************************************/ \ No newline at end of file Added: gsoc07_featuredetection/FeatureMatcher.h =================================================================== --- gsoc07_featuredetection/FeatureMatcher.h (rev 0) +++ gsoc07_featuredetection/FeatureMatcher.h 2007-08-16 21:47:47 UTC (rev 2393) @@ -0,0 +1,37 @@ +/*************************************************************************** + * 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_ + +#include "Descriptor.h" + +class FeatureMatcher + { + public: + FeatureMatcher(int nrImages); + void match(); + void addDescriptor(Descriptor* descriptor, int imageIndex) + void getCtrlPoints(); + + private: + + }; +#endif /*FEATUREMATCHER_H_*/ Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-15 10:17:16 UTC (rev 2392) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-16 21:47:47 UTC (rev 2393) @@ -231,21 +231,22 @@ //TODO: //leave out pixels close to the edge; number of left-out pixels //vary according to image size - int xEnd=height-80; - int yEnd=width-80; + int offsetX=height*0.2; + int offsetY=width*0.2; - for(int i=80;i<xEnd;i++) { - for(int j=80; j<yEnd;j++) { + int xStart=offsetX; + int yStart=offsetY; + int xEnd=height-offsetX; + int yEnd=width-offsetY; - //calculate the determinants around the pixel, because of non-maxima suppression - for(int k=-1;k<2;k++) { - for(int l=-1; l<2;l++) { - if(determinants[i+k][j+l]==iMax) { //if determinant for that pixel hasn't been set - _calculateMaxDet(i+k,j+l); //calculate it - } - } - } + for(int i=xStart;i<xEnd;i++) { + for(int j=yStart; j<yEnd;j++) { + _calculateMaxDet(i,j); //calculate it + } + } + for(int i=xStart;i<xEnd;i++) { + for(int j=yStart; j<yEnd;j++) { /**Non-maxima suppression *if any determinant in the area around the pixel is *greater than the pixel, suppress the current pixel. @@ -261,7 +262,7 @@ 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); + this->_insertToList(&i,&j); } //cout << maximas[i][j]<<","<<determinants[i][j]<< " "; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-17 21:39:23
|
Revision: 2398 http://hugin.svn.sourceforge.net/hugin/?rev=2398&view=rev Author: stereo_sl Date: 2007-08-17 14:39:21 -0700 (Fri, 17 Aug 2007) Log Message: ----------- - function for generating XML, needed for autopano-SIFT Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/Image.cpp gsoc07_featuredetection/Image.h Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-17 19:25:49 UTC (rev 2397) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-17 21:39:21 UTC (rev 2398) @@ -20,6 +20,7 @@ #include <stdio.h> #include <iostream> +#include <fstream> #include <stdlib.h> #include "Descriptor.h" @@ -164,7 +165,7 @@ orientation=round(atan2(Sy[orientation],Sx[orientation]) * 180 / PI); //if(orientation<0) orientation=360+orientation; - //this->orientations[pointCount]=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)); @@ -604,8 +605,8 @@ int yEnd=(interestPoint[1]); //first subregion - for(int i=xStart;i<=xEnd;i++) { - for(int j=yStart; j<=yEnd;j++) { + 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]); @@ -619,8 +620,8 @@ xEnd=(interestPoint[0]); yStart=(interestPoint[1]); yEnd=(interestPoint[1]+regionSize); - for(int i=xStart;i<=xEnd;i++) { - for(int j=yStart; j<=yEnd;j++) { + 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]); @@ -634,8 +635,8 @@ xEnd=(interestPoint[0]+regionSize); yStart=(interestPoint[1]-regionSize); yEnd=(interestPoint[1]); - for(int i=xStart;i<=xEnd;i++) { - for(int j=yStart; j<=yEnd;j++) { + 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]); @@ -704,3 +705,48 @@ } } +bool Descriptor::generateAutopanoXML(string name) { + ofstream xmlFile (name.c_str()); + if (xmlFile.is_open()) + { + xmlFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"<< endl; + xmlFile << "<KeypointXMLList>\n"; + xmlFile << " <XDim>"<< this->image->getHeight() <<"</XDim>"<< endl; + xmlFile << " <YDim>"<< this->image->getWidth() <<"</YDim>"<< endl; + xmlFile << " <ImageFile>"<< this->image->getPath() <<"</ImageFile>"<< endl; + xmlFile << " <Arr>"<< 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; + + xmlFile << " <KeypointN>"<< 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; + xmlFile << " <Descriptor>"<<endl; + + for (vector<double>::iterator it = iterDesc->begin(); it != iterDesc->end(); ++it) { + xmlFile << " <int>"<< (int)*it << "</int>" << endl; + } + xmlFile << " </Descriptor>"<<endl; + xmlFile << " </KeypointN>"<< endl; + + iter1++; + iterDesc++; + c++; + } + + xmlFile << " </Arr>"<< endl; + xmlFile << "</KeypointXMLList>"<< endl; + + xmlFile.close(); + return true; + } + else return false; +} Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-08-17 19:25:49 UTC (rev 2397) +++ gsoc07_featuredetection/Descriptor.h 2007-08-17 21:39:21 UTC (rev 2398) @@ -20,6 +20,7 @@ #ifndef DESCRIPTOR_H_INCLUDED #define DESCRIPTOR_H_INCLUDED +#include <string> #include "Image.h" #include "HessianDetector.h" @@ -39,6 +40,7 @@ void createDescriptors(); vector<vector<double> >* getDescriptors(); void printDescriptors(std::ostream & o); + bool generateAutopanoXML(string name); private: Image* image; Modified: gsoc07_featuredetection/Image.cpp =================================================================== --- gsoc07_featuredetection/Image.cpp 2007-08-17 19:25:49 UTC (rev 2397) +++ gsoc07_featuredetection/Image.cpp 2007-08-17 21:39:21 UTC (rev 2398) @@ -186,4 +186,7 @@ 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; +} Modified: gsoc07_featuredetection/Image.h =================================================================== --- gsoc07_featuredetection/Image.h 2007-08-17 19:25:49 UTC (rev 2397) +++ gsoc07_featuredetection/Image.h 2007-08-17 21:39:21 UTC (rev 2398) @@ -37,12 +37,13 @@ public: Image(string p); void convolute(int* kernel,int dim1, int dim2,double scale); - int getPixel(int x,int y); - int getIntegralPixel(int x,int y); + 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); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-19 22:26:51
|
Revision: 2399 http://hugin.svn.sourceforge.net/hugin/?rev=2399&view=rev Author: stereo_sl Date: 2007-08-19 15:26:48 -0700 (Sun, 19 Aug 2007) Log Message: ----------- - class for descriptor matching Modified Paths: -------------- gsoc07_featuredetection/Descriptor.cpp gsoc07_featuredetection/Descriptor.h gsoc07_featuredetection/FeatureMatcher.cpp gsoc07_featuredetection/FeatureMatcher.h Modified: gsoc07_featuredetection/Descriptor.cpp =================================================================== --- gsoc07_featuredetection/Descriptor.cpp 2007-08-17 21:39:21 UTC (rev 2398) +++ gsoc07_featuredetection/Descriptor.cpp 2007-08-19 22:26:48 UTC (rev 2399) @@ -709,8 +709,8 @@ ofstream xmlFile (name.c_str()); if (xmlFile.is_open()) { - xmlFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"<< endl; - xmlFile << "<KeypointXMLList>\n"; + 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 << " <ImageFile>"<< this->image->getPath() <<"</ImageFile>"<< endl; @@ -724,8 +724,8 @@ vector<int > tmp2=*iter1; xmlFile << " <KeypointN>"<< endl; - xmlFile << " <X>"<< tmp2[0] <<"</X>"<<endl; - xmlFile << " <Y>"<< tmp2[1] <<"</Y>"<<endl; + xmlFile << " <X>"<< tmp2[1] <<"</X>"<<endl; + xmlFile << " <Y>"<< tmp2[0] <<"</Y>"<<endl; xmlFile << " <Scale>"<< this->_getMaxima(tmp2[0],tmp2[1]) <<"</Scale>"<<endl; xmlFile << " <Orientation>"<< 0 <<"</Orientation>"<<endl; xmlFile << " <Dim>"<< DESCRIPTOR_SIZE <<"</Dim>"<<endl; Modified: gsoc07_featuredetection/Descriptor.h =================================================================== --- gsoc07_featuredetection/Descriptor.h 2007-08-17 21:39:21 UTC (rev 2398) +++ gsoc07_featuredetection/Descriptor.h 2007-08-19 22:26:48 UTC (rev 2399) @@ -41,7 +41,9 @@ vector<vector<double> >* getDescriptors(); void printDescriptors(std::ostream & o); bool generateAutopanoXML(string name); + vector<vector<int> >* interestPoints; + private: Image* image; HessianDetector* hd; @@ -51,7 +53,6 @@ //double _initDescriptor(double* desciptor); void _GaborResponse(int x,int y,double maxima,double* descriptor); - vector<vector<int> >* interestPoints; vector<vector<int> >* maximas; vector<vector<double> > descriptors; int orientations[]; Modified: gsoc07_featuredetection/FeatureMatcher.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-17 21:39:21 UTC (rev 2398) +++ gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-19 22:26:48 UTC (rev 2399) @@ -16,4 +16,96 @@ * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ \ No newline at end of file + ***************************************************************************/ + +#include <stdio.h> +#include <iostream> +#include <fstream> +#include <stdlib.h> +#include "FeatureMatcher.h" + + +FeatureMatcher::FeatureMatcher(int nrImages, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt) { + this->descriptor1 = d1; + this->descriptor2 = d2; + this->matchingType = mt; +} + +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 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); + } + iter1++; + pointCount++; + } +} +/*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; +} +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; +} Modified: gsoc07_featuredetection/FeatureMatcher.h =================================================================== --- gsoc07_featuredetection/FeatureMatcher.h 2007-08-17 21:39:21 UTC (rev 2398) +++ gsoc07_featuredetection/FeatureMatcher.h 2007-08-19 22:26:48 UTC (rev 2399) @@ -21,17 +21,29 @@ #ifndef FEATUREMATCHER_H_ #define FEATUREMATCHER_H_ +#define FM_MATCHING_TYPE int +#define FM_SECOND_NN 1 + #include "Descriptor.h" class FeatureMatcher { public: - FeatureMatcher(int nrImages); - void match(); - void addDescriptor(Descriptor* descriptor, int imageIndex) - void getCtrlPoints(); - + FeatureMatcher(int nrImages, 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(); + //void printCtrlPoints(); + //void setPoints(vector<vector<double> >* desc); + private: + Descriptor* descriptor1; + Descriptor* descriptor2; + FM_MATCHING_TYPE matchingType; + double _getDistance(vector<double>* d1,vector<double>* d2); + vector<vector<int> > controlPoints; // form: {x1,y1,x2,y2} + }; #endif /*FEATUREMATCHER_H_*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ste...@us...> - 2007-08-20 13:33:42
|
Revision: 2402 http://hugin.svn.sourceforge.net/hugin/?rev=2402&view=rev Author: stereo_sl Date: 2007-08-20 06:33:40 -0700 (Mon, 20 Aug 2007) Log Message: ----------- - created standalone application for feature detection&matching based on runDetDesc.cpp - updated cMakeLists.txt to allow compilation Modified Paths: -------------- gsoc07_featuredetection/CMakeLists.txt gsoc07_featuredetection/FeatureMatcher.cpp gsoc07_featuredetection/FeatureMatcher.h gsoc07_featuredetection/HessianDetector.cpp Removed Paths: ------------- gsoc07_featuredetection/runDetDesc.cpp Modified: gsoc07_featuredetection/CMakeLists.txt =================================================================== --- gsoc07_featuredetection/CMakeLists.txt 2007-08-20 13:26:31 UTC (rev 2401) +++ gsoc07_featuredetection/CMakeLists.txt 2007-08-20 13:33:40 UTC (rev 2402) @@ -2,7 +2,7 @@ PROJECT(opencv) #if you don't want the full compiler output, remove the following line -SET(CMAKE_VERBOSE_MAKEFILE ON) +#SET(CMAKE_VERBOSE_MAKEFILE ON) # check for opencv FIND_PATH(OPENCV_INCLUDE_DIR cv.h PATH_SUFFIXES opencv) @@ -17,7 +17,7 @@ TARGET_LINK_LIBRARIES(main highgui cv cxcore png jpeg) #list all source files here -ADD_EXECUTABLE(runDetDesc runDetDesc.cpp Image.cpp HessianDetector.cpp Descriptor.cpp) +ADD_EXECUTABLE(FeatureMatching FeatureMatching.cpp Image.cpp HessianDetector.cpp Descriptor.cpp FeatureMatcher.cpp) #need to link to some other libraries ? just add them here -TARGET_LINK_LIBRARIES(runDetDesc highgui cv cxcore png jpeg) +TARGET_LINK_LIBRARIES(FeatureMatching highgui cv cxcore png jpeg) Modified: gsoc07_featuredetection/FeatureMatcher.cpp =================================================================== --- gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-20 13:26:31 UTC (rev 2401) +++ gsoc07_featuredetection/FeatureMatcher.cpp 2007-08-20 13:33:40 UTC (rev 2402) @@ -25,17 +25,18 @@ #include "FeatureMatcher.h" -FeatureMatcher::FeatureMatcher(int nrImages, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt) { +FeatureMatcher::FeatureMatcher(int nrCP, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt) { this->descriptor1 = d1; this->descriptor2 = d2; this->matchingType = mt; + this->nrControlPoints = nrCP; } void FeatureMatcher::match(double threshold) { - vector<vector<double> >* descriptors1=(*this->descriptor1).getDescriptors(); - vector<vector<double> >::iterator iter1 = (*descriptors1).begin(); + vector<vector<double> >* descriptors1=this->descriptor1->getDescriptors(); + vector<vector<double> >::iterator iter1 = descriptors1->begin(); - vector<vector<double> >* descriptors2=(*this->descriptor2).getDescriptors(); + vector<vector<double> >* descriptors2=this->descriptor2->getDescriptors(); int pointCount=0; int max; @@ -43,10 +44,10 @@ vector<int> controlPoint; - while( iter1 != (*descriptors1).end()) { + while( iter1 != descriptors1->end()) { vector<double> current1 = *iter1; - vector<vector<double> >::iterator iter2 =(*descriptors2).begin(); + vector<vector<double> >::iterator iter2 =descriptors2->begin(); max=1; maxId=0; @@ -58,7 +59,7 @@ double diff=distance; //nearest neighbour double diff2=std::numeric_limits<double>::max(); //second nearest neighbour - while( iter2 != (*descriptors2).end()) { + while( iter2 != descriptors2->end()) { current2 = *iter2; distance=_getDistance(¤t1,¤t2); @@ -74,7 +75,6 @@ iter2++; } - if(diff<(threshold*diff2)) { controlPoint.clear(); Modified: gsoc07_featuredetection/FeatureMatcher.h =================================================================== --- gsoc07_featuredetection/FeatureMatcher.h 2007-08-20 13:26:31 UTC (rev 2401) +++ gsoc07_featuredetection/FeatureMatcher.h 2007-08-20 13:33:40 UTC (rev 2402) @@ -29,7 +29,7 @@ class FeatureMatcher { public: - FeatureMatcher(int nrImages, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt=FM_SECOND_NN); + FeatureMatcher(int nrCP, Descriptor* d1, Descriptor* d2, FM_MATCHING_TYPE mt=FM_SECOND_NN); void match(double threshold=0.7); //void addDescriptor(Descriptor* descriptor) @@ -41,6 +41,7 @@ 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} Modified: gsoc07_featuredetection/HessianDetector.cpp =================================================================== --- gsoc07_featuredetection/HessianDetector.cpp 2007-08-20 13:26:31 UTC (rev 2401) +++ gsoc07_featuredetection/HessianDetector.cpp 2007-08-20 13:33:40 UTC (rev 2402) @@ -222,7 +222,6 @@ } bool HessianDetector::_boxFilterDetect() { - //cout << "started detecting"<< kernelSize <<"\n"; int height = this->image->getHeightBW()-1; int width = this->image->getWidthBW()-1; Deleted: gsoc07_featuredetection/runDetDesc.cpp =================================================================== --- gsoc07_featuredetection/runDetDesc.cpp 2007-08-20 13:26:31 UTC (rev 2401) +++ gsoc07_featuredetection/runDetDesc.cpp 2007-08-20 13:33:40 UTC (rev 2402) @@ -1,124 +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 1 -//#define USE_VIGRA 1 - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <iostream> -#include <fstream> -#include <stdlib.h> -#include <math.h> -#include <ctime> -#include <algorithm> - -#include <string> -#include "Image.h" -#include "HessianDetector.h" -#include "Descriptor.h" -#include <limits> - -using namespace std; - -void usage() -{ - cout << "runDetDesc: run feature detection and extraction" << endl - << endl - << "Usage: runDetDesc [options] -i input.pgm -o output.txt" << endl - << "Options:" << endl - << " -i input.pgm Input image" << endl - << " -o output.txt output file with interest points and descriptors" << endl - << " -n num Extract num interest points an descriptors" << endl - << " TODO: replace with threshold, default 1000" << endl - << endl; -} - - -int main(int argc, char *argv[]) -{ - - const char * optstring = "hi:o:n:"; - char c; - clock_t start,finish; - double time; - - std::string input; - std::string output; - int nrPoints = 1000; - - // parse arguments - while ((c = getopt (argc, argv, optstring)) != -1) - { - switch(c) { - case 'i': - input = optarg; - break; - case 'o': - output = optarg; - break; - case 'n': - nrPoints = atoi(optarg); - break; - case 'h': - usage(); - return 0; - break; - default: - abort(); - } - } - - Image im1(input); - if(!im1.open()) { - cout<< "Error! Image " << input << "can not be opened"<<"\n"; - return 0; - } - start = clock(); - //need to integrate the image before the detection process(only if using box filter approximation) - im1.integrate(); - - HessianDetector hd1(&im1,nrPoints, HD_BOX_FILTERS,1); - if(!hd1.detect()) { - cout << "Detection of points failed!"; - return 1; - } - finish = clock(); - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - cout << "Extracted " << nrPoints << " interest points, time:"<<time<<"\n"; - - start = clock(); - vector<vector<int> >* interestPoints1=hd1.getPoints(); - - Descriptor d1(&im1,&hd1); - d1.setPoints(interestPoints1); - //d.orientate(); - d1.createDescriptors(); - finish = clock(); - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - cout << "Extracted descriptors, time:"<<time<<"\n"; - - std::ofstream output2(output.c_str()); - d1.printDescriptors(output2); -} - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |