template<class SrcArrayT>
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 Geometry::InterestPointList pointList; 00043 Array2dScalarReal64* imPrev = cache[i-1]; 00044 Array2dScalarReal64* im = cache[i]; 00045 Array2dScalarReal64* imNext = cache[i+1]; 00046 for(int x = borderIgnoreSize; x < im->CW() - borderIgnoreSize; x++) 00047 { 00048 for(int y = borderIgnoreSize; y < im->CH() - borderIgnoreSize; y++) 00049 { 00050 Real64 v = im->Val(x, y); 00051 if(fabs(v) < 0.001) continue; 00052 if((v >= im->Val(x, y+1)) && 00053 (v >= im->Val(x+1, y)) && 00054 (v >= im->Val(x, y-1)) && 00055 (v >= im->Val(x-1, y)) && 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 >= im->Val(x+1, y-1)) && 00060 (v >= imPrev->Val(x, y)) && 00061 (v >= imPrev->Val(x, y+1)) && 00062 (v >= imPrev->Val(x+1, y)) && 00063 (v >= imPrev->Val(x, y-1)) && 00064 (v >= imPrev->Val(x-1, y)) && 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 >= imPrev->Val(x+1, y-1)) && 00069 (v >= imNext->Val(x, y)) && 00070 (v >= imNext->Val(x, y+1)) && 00071 (v >= imNext->Val(x+1, y)) && 00072 (v >= imNext->Val(x, y-1)) && 00073 (v >= imNext->Val(x-1, y)) && 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 (v >= imNext->Val(x+1, y-1))) 00078 { 00079 // found one 00080 output->Add(x, y, precomputeScales[i], 0, v); 00081 } else if((v <= im->Val(x, y+1)) && 00082 (v <= im->Val(x+1, y)) && 00083 (v <= im->Val(x, y-1)) && 00084 (v <= im->Val(x-1, y)) && 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 <= im->Val(x+1, y-1)) && 00089 (v <= imPrev->Val(x, y)) && 00090 (v <= imPrev->Val(x, y+1)) && 00091 (v <= imPrev->Val(x+1, y)) && 00092 (v <= imPrev->Val(x, y-1)) && 00093 (v <= imPrev->Val(x-1, y)) && 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 <= imPrev->Val(x+1, y-1)) && 00098 (v <= imNext->Val(x, y)) && 00099 (v <= imNext->Val(x, y+1)) && 00100 (v <= imNext->Val(x+1, y)) && 00101 (v <= imNext->Val(x, y-1)) && 00102 (v <= imNext->Val(x-1, y)) && 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 (v <= imNext->Val(x+1, y-1))) 00107 { 00108 // found one 00109 output->Add(x, y, precomputeScales[i], 0, v); 00110 } 00111 } 00112 } 00113 } 00114 for(int i = 0; i < cache.size(); i++) 00115 { 00116 delete cache[i]; 00117 } 00118 return output; 00119 }
Here is the call graph for this function:
|