SIFThough.C
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 #include "SIFT/SIFThough.H"
00039 #include "Util/Assert.H"
00040 #include "Util/Promotions.H"  
00041 #include <cmath>
00042 
00043 #define NBINX 8
00044 #define NBINY 8
00045 #define NBINO 8
00046 #define NBINS 8
00047 
00048 
00049 SIFThough::SIFThough() :
00050   itsData(NBINX * NBINY * NBINO * NBINS, 0.0F)
00051 { }
00052 
00053 
00054 SIFThough::~SIFThough()
00055 { }
00056 
00057 
00058 void SIFThough::addValue(const float dx, const float dy, const float doo,
00059                          const float ds, const float value)
00060 {
00061   int xi0, xi1, yi0, yi1, oi0, oi1, si0, si1;   
00062   float wx0, wy0, wo0, ws0, wx1, wy1, wo1, ws1; 
00063 
00064   
00065   
00066   
00067   if (dx <= 0.5F)
00068     { xi0 = 0; xi1 = 0; wx0 = 0.5F; wx1 = 0.5F; }
00069   else if (dx >= NBINX-0.5F)
00070     { xi0 = 3; xi1 = 3; wx0 = 0.5F; wx1 = 0.5F; }
00071   else
00072     {
00073       const float xx = dx - 0.5F;
00074       xi0 = int(xx); xi1 = xi0 + 1;
00075       wx1 = xx - float(xi0); wx0 = 1.0F - wx1;
00076     }
00077 
00078   if (dy <= 0.5F)
00079     { yi0 = 0; yi1 = 0; wy0 = 0.5F; wy1 = 0.5F; }
00080   else if (dy >= NBINY-0.5F)
00081     { yi0 = 3; yi1 = 3; wy0 = 0.5F; wy1 = 0.5F; }
00082   else
00083     {
00084       const float yy = dy - 0.5F;
00085       yi0 = int(yy); yi1 = yi0 + 1;
00086       wy1 = yy - float(yi0); wy0 = 1.0F - wy1;
00087     }
00088 
00089   
00090   if (doo <= 0.5F)
00091     {
00092       oi0 = 0; oi1 = 7;
00093       wo0 = 0.5F + doo; wo1 = 1.0F - wo0;
00094     }
00095   else if (doo >= NBINO-0.5F)
00096     {
00097       oi0 = 7; oi1 = 0;
00098       wo0 = 8.5F - doo; wo1 = 1.0F - wo0;
00099     }
00100   else
00101     {
00102       const float oo = doo - 0.5F;
00103       oi0 = int(oo); oi1 = oi0 + 1;
00104       wo1 = oo - float(oi0); wo0 = 1.0F - wo1;
00105     }
00106 
00107   if (ds <= 0.5F)
00108     { si0 = 0; si1 = 0; ws0 = 0.5F; ws1 = 0.5F; }
00109   else if (ds >= NBINS-0.5F)
00110     { si0 = 3; si1 = 3; ws0 = 0.5F; ws1 = 0.5F; }
00111   else
00112     {
00113       const float ss = ds - 0.5F;
00114       si0 = int(ss); si1 = si0 + 1;
00115       ws1 = ss - float(si0); ws0 = 1.0F - ws1;
00116     }
00117 
00118   
00119   
00120   
00121   
00122   xi0 = xi0 * NBINO*NBINS*NBINY; xi1 = xi1 * NBINO*NBINS*NBINY;
00123   yi0 = yi0 * NBINO*NBINS; yi1 = yi1 * NBINO*NBINS;
00124   si0 = si0 * NBINO; si1 = si1 * NBINO;
00125 
00126   itsData[xi0 + yi0 + oi0 + si0] += value * wx0 * wy0 * wo0 * ws0;
00127   itsData[xi1 + yi0 + oi0 + si0] += value * wx1 * wy0 * wo0 * ws0;
00128   itsData[xi0 + yi1 + oi0 + si0] += value * wx0 * wy1 * wo0 * ws0;
00129   itsData[xi1 + yi1 + oi0 + si0] += value * wx1 * wy1 * wo0 * ws0;
00130   itsData[xi0 + yi0 + oi1 + si0] += value * wx0 * wy0 * wo1 * ws0;
00131   itsData[xi1 + yi0 + oi1 + si0] += value * wx1 * wy0 * wo1 * ws0;
00132   itsData[xi0 + yi1 + oi1 + si0] += value * wx0 * wy1 * wo1 * ws0;
00133   itsData[xi1 + yi1 + oi1 + si0] += value * wx1 * wy1 * wo1 * ws0;
00134   itsData[xi0 + yi0 + oi0 + si1] += value * wx0 * wy0 * wo0 * ws1;
00135   itsData[xi1 + yi0 + oi0 + si1] += value * wx1 * wy0 * wo0 * ws1;
00136   itsData[xi0 + yi1 + oi0 + si1] += value * wx0 * wy1 * wo0 * ws1;
00137   itsData[xi1 + yi1 + oi0 + si1] += value * wx1 * wy1 * wo0 * ws1;
00138   itsData[xi0 + yi0 + oi1 + si1] += value * wx0 * wy0 * wo1 * ws1;
00139   itsData[xi1 + yi0 + oi1 + si1] += value * wx1 * wy0 * wo1 * ws1;
00140   itsData[xi0 + yi1 + oi1 + si1] += value * wx0 * wy1 * wo1 * ws1;
00141   itsData[xi1 + yi1 + oi1 + si1] += value * wx1 * wy1 * wo1 * ws1;
00142 }
00143 
00144 
00145 void SIFThough::getPeak(float& dx, float& dy, float& doo, float& ds) const
00146 {
00147   const uint siz = itsData.size();
00148   float maxi = -1.0e-30; uint maxindex = 0;
00149 
00150   
00151   for (uint i = 0; i < siz; i ++)
00152     if (itsData[i] > maxi) { maxi = itsData[i]; maxindex = i; }
00153 
00154   
00155   const uint ix = maxindex / (NBINO*NBINS*NBINY);
00156   maxindex -= ix * NBINO*NBINS*NBINY;
00157   const uint iy = maxindex / (NBINO*NBINS);
00158   maxindex -= iy * NBINO*NBINS;
00159   const uint is = maxindex / NBINO;
00160   maxindex -= is * NBINO;
00161   const uint io = maxindex;
00162 
00163   
00164   
00165   dx = float(ix); dy = float(iy); doo = float(io); ds = float(is);
00166 }
00167 
00168 
00169 
00170 
00171 
00172