Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

template<class SrcArrayT>
PointDescriptorTable* Impala::Core::Feature::LaplacianDetection ( SrcArrayT *  imIntensity,
bool  useRecGauss,
Real64  precision 
)

Definition at line 20 of file LaplacianDetector.h.

References Impala::Core::Table::TableTem< Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T >::Add(), ILOG_DEBUG, ILOG_VAR, Impala::Core::Array::Laplacian(), and Impala::Application::DemoCamera2d::sigma.

Referenced by LaplacianDetector().

00022 {
00023     ILOG_VAR(Core.Feature.LaplacianDetection);
00024     PointDescriptorTable* output = new PointDescriptorTable();
00025     using namespace Impala::Core::Array;
00026     std::vector<Real64> precomputeScales;
00027     std::vector<Array2dScalarReal64*> cache;
00028     for(int i = 0; i < 21; i++) 
00029     {
00030         Real64 sigma = pow(sqrt(sqrt(Real64(2))),i) * 0.8;
00031         precomputeScales.push_back(sigma);
00032         Array2dScalarReal64* tmp = 0;
00033         Laplacian(tmp, imIntensity, sigma, 1, useRecGauss, precision);
00034         cache.push_back(tmp);
00035 
00036         ILOG_DEBUG("Computing Laplacian scale: " << sigma);
00037     }
00038     
00039     int borderIgnoreSize = 5;
00040     for(int i = 1; i < 20; i++) 
00041     {
00042         Array2dScalarReal64* imPrev = cache[i-1]; 
00043         Array2dScalarReal64* im     = cache[i];
00044         Array2dScalarReal64* imNext = cache[i+1];
00045         for(int x = borderIgnoreSize; x < im->CW() - borderIgnoreSize; x++)
00046         {
00047             for(int y = borderIgnoreSize; y < im->CH() - borderIgnoreSize; y++)
00048             {
00049                 Real64 v = im->Val(x, y);
00050                 if(fabs(v) < 0.001) continue;
00051                 if((v >= im->Val(x, y+1)) &&
00052                    (v >= im->Val(x+1, y)) &&
00053                    (v >= im->Val(x, y-1)) &&
00054                    (v >= im->Val(x-1, y)) &&
00055                    (v >= im->Val(x+1, y+1)) &&
00056                    (v >= im->Val(x-1, y-1)) &&
00057                    (v >= im->Val(x-1, y+1)) &&
00058                    (v >= im->Val(x+1, y-1)) &&
00059                    (v >= imPrev->Val(x, y)) &&
00060                    (v >= imPrev->Val(x, y+1)) &&
00061                    (v >= imPrev->Val(x+1, y)) &&
00062                    (v >= imPrev->Val(x, y-1)) &&
00063                    (v >= imPrev->Val(x-1, y)) &&
00064                    (v >= imPrev->Val(x+1, y+1)) &&
00065                    (v >= imPrev->Val(x-1, y-1)) &&
00066                    (v >= imPrev->Val(x-1, y+1)) &&
00067                    (v >= imPrev->Val(x+1, y-1)) &&
00068                    (v >= imNext->Val(x, y)) &&
00069                    (v >= imNext->Val(x, y+1)) &&
00070                    (v >= imNext->Val(x+1, y)) &&
00071                    (v >= imNext->Val(x, y-1)) &&
00072                    (v >= imNext->Val(x-1, y)) &&
00073                    (v >= imNext->Val(x+1, y+1)) &&
00074                    (v >= imNext->Val(x-1, y-1)) &&
00075                    (v >= imNext->Val(x-1, y+1)) &&
00076                    (v >= imNext->Val(x+1, y-1)))
00077                 {
00078                     // found one
00079                     output->Add(x, y, precomputeScales[i], 0, v);
00080                 } else if((v <= im->Val(x, y+1)) &&
00081                    (v <= im->Val(x+1, y)) &&
00082                    (v <= im->Val(x, y-1)) &&
00083                    (v <= im->Val(x-1, y)) &&
00084                    (v <= im->Val(x+1, y+1)) &&
00085                    (v <= im->Val(x-1, y-1)) &&
00086                    (v <= im->Val(x-1, y+1)) &&
00087                    (v <= im->Val(x+1, y-1)) &&
00088                    (v <= imPrev->Val(x, y)) &&
00089                    (v <= imPrev->Val(x, y+1)) &&
00090                    (v <= imPrev->Val(x+1, y)) &&
00091                    (v <= imPrev->Val(x, y-1)) &&
00092                    (v <= imPrev->Val(x-1, y)) &&
00093                    (v <= imPrev->Val(x+1, y+1)) &&
00094                    (v <= imPrev->Val(x-1, y-1)) &&
00095                    (v <= imPrev->Val(x-1, y+1)) &&
00096                    (v <= imPrev->Val(x+1, y-1)) &&
00097                    (v <= imNext->Val(x, y)) &&
00098                    (v <= imNext->Val(x, y+1)) &&
00099                    (v <= imNext->Val(x+1, y)) &&
00100                    (v <= imNext->Val(x, y-1)) &&
00101                    (v <= imNext->Val(x-1, y)) &&
00102                    (v <= imNext->Val(x+1, y+1)) &&
00103                    (v <= imNext->Val(x-1, y-1)) &&
00104                    (v <= imNext->Val(x-1, y+1)) &&
00105                    (v <= imNext->Val(x+1, y-1)))
00106                 {
00107                     // found one
00108                     output->Add(x, y, precomputeScales[i], 0, v);
00109                 }
00110             }
00111         }
00112     }
00113     for(int i = 0; i < cache.size(); i++) 
00114     {
00115         delete cache[i];
00116     }
00117     return output;
00118 }

Here is the call graph for this function:


Generated on Thu Jan 13 09:19:01 2011 for ImpalaSrc by  doxygen 1.5.1