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

RectanglePyramid.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_Geometry_RectanglePyramid_h
00002 #define Impala_Core_Geometry_RectanglePyramid_h
00003 
00004 #include "Core/Geometry/RectangleSet.h"
00005 #include "Core/Geometry/MakeOverlappingRects.h"
00006 
00007 namespace Impala
00008 {
00009 namespace Core
00010 {
00011 namespace Geometry
00012 {
00013 
00014 
00017 class RectanglePyramid
00018 {
00019 public:
00020 
00021     RectanglePyramid()
00022     {
00023         mImWidth = -1;
00024         mImHeight = -1;
00025         mBorderWidth = -1;
00026         mNrRectPerDimMin = -1;
00027         mNrRectPerDimMax = -1;
00028         mNrRectStepSize = -1;
00029     }
00030 
00031     RectanglePyramid(int borderWidth, int nrRectPerDimMin, int nrRectPerDimMax,
00032                      int nrRectStepSize, int imWidth, int imHeight)
00033     {
00034         mImWidth = -1;
00035         mImHeight = -1;
00036         mBorderWidth = borderWidth;
00037         mNrRectPerDimMin = nrRectPerDimMin;
00038         mNrRectPerDimMax = nrRectPerDimMax;
00039         mNrRectStepSize = nrRectStepSize;
00040         int curR = 0;
00041         for (int nr=mNrRectPerDimMin ; nr<=mNrRectPerDimMax ;
00042              nr+=mNrRectStepSize)
00043         {
00044             mRectSet.push_back(RectangleSet());
00045             mNrRectsPerDim.push_back(nr);
00046         }
00047         if((imWidth >=0) && (imHeight >= 0)) {
00048             /* do something with the passed imWidth and imHeight */
00049             SetImageSize(imWidth, imHeight);
00050         }
00051     }
00052 
00053     void
00054     SetImageSize(int imWidth, int imHeight)
00055     {
00056         if (mBorderWidth == -1)
00057             return;
00058         if ((imWidth == mImWidth) && (imHeight == mImHeight))
00059             return;
00060         mImWidth = imWidth;
00061         mImHeight = imHeight;
00062         for (int i=0 ; i<mRectSet.size() ; i++)
00063         {
00064             mRectSet[i].clear();
00065             MakeOverlappingRects(std::back_inserter(mRectSet[i]),
00066                                  mImWidth, mImHeight, mBorderWidth,
00067                                  mNrRectsPerDim[i], mNrRectsPerDim[i], 1);
00068         }
00069     }
00070 
00071     int
00072     NrLevels() const
00073     {
00074         return mNrRectsPerDim.size();
00075     }
00076 
00077     int
00078     NrRectsPerDim(int level) const
00079     {
00080         return mNrRectsPerDim[level];
00081     }
00082 
00083     int
00084     TotalNrRects() const
00085     {
00086         if (mNrRectPerDimMin == -1)
00087             return 0;
00088         int sum = 0;
00089         for (int nr=mNrRectPerDimMin ; nr<=mNrRectPerDimMax ;
00090              nr+=mNrRectStepSize)
00091         {
00092             sum += (nr+(nr-1))*(nr+(nr-1));
00093         }
00094         return sum;
00095     }
00096 
00097     int
00098     NrRects(int level) const
00099     {
00100         if (mRectSet[level].size() != 0) // known image size, so exact number
00101             return mRectSet[level].size();
00102         int r = NrRectsPerDim(level);
00103         return (r+(r-1))*(r+(r-1)); // unknown image size, but should be this
00104     }
00105 
00106     /* DK: obsolete and wrong?
00107     int
00108     FirstRect(int level) const
00109     {
00110         if (level == 0)
00111             return 0;
00112         int res = 0;
00113         for (int i=0 ; i<level ; i++)
00114             res += mRectSet[i].size();
00115         return res;
00116     }
00117     */
00118 
00119     Rectangle
00120     Rect(int level, int nr) const
00121     {
00122         return mRectSet[level][nr];
00123     }
00124 
00125     int
00126     GetBorderWidth() const
00127     {
00128         return mBorderWidth;
00129     }
00130 
00131     int
00132     GetImWidth() const
00133     {
00134         return mImWidth;
00135     }
00136 
00137     int
00138     GetImHeight() const
00139     {
00140         return mImHeight;
00141     }
00142 
00143 private:
00144 
00145     int                       mImWidth;
00146     int                       mImHeight;
00147     int                       mBorderWidth;
00148     int                       mNrRectPerDimMin;
00149     int                       mNrRectPerDimMax;
00150     int                       mNrRectStepSize;
00151     std::vector<RectangleSet> mRectSet;  // set of rectangles for each level
00152     std::vector<int>          mNrRectsPerDim; // nr rects per dim for each level
00153 
00154 };
00155 
00156 } // namespace Geometry
00157 } // namespace Core
00158 } // namespace Impala
00159 
00160 #endif

Generated on Fri Mar 19 09:31:09 2010 for ImpalaSrc by  doxygen 1.5.1