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

RectanglePyramidPerDim.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_Geometry_RectanglePyramidPerDim_h
00002 #define Impala_Core_Geometry_RectanglePyramidPerDim_h
00003 
00004 #include "Core/Geometry/RectangleSet.h"
00005 #include "Core/Geometry/MakeSubRects.h"
00006 
00007 namespace Impala
00008 {
00009 namespace Core
00010 {
00011 namespace Geometry
00012 {
00013 
00014 
00024 class RectanglePyramidPerDim
00025 {
00026 public:
00027 
00028     RectanglePyramidPerDim()
00029     {
00030         mImWidth = -1;
00031         mImHeight = -1;
00032         mBorderWidth = -1;
00033 
00034         mNrRectPerDimMinX = -1;
00035         mNrRectPerDimMaxX = -1;
00036         mNrRectStepSizeX = -1;
00037 
00038         mNrRectPerDimMinY = -1;
00039         mNrRectPerDimMaxY = -1;
00040         mNrRectStepSizeY = -1;
00041 
00042         mRegionOverlapRatio = -1;
00043 
00044     }
00045 
00046     RectanglePyramidPerDim(int borderWidth,
00047                            int nrRectPerDimMinX, int nrRectPerDimMaxX,
00048                            int nrRectStepSizeX,
00049                            int nrRectPerDimMinY, int nrRectPerDimMaxY,
00050                            int nrRectStepSizeY,
00051                            int imWidth, int imHeight,
00052                            double regionOverlapRatio=0.5)
00053     {
00054         mImWidth = -1;
00055         mImHeight = -1;
00056         mBorderWidth = borderWidth;
00057         mRegionOverlapRatio = regionOverlapRatio;
00058 
00059         mNrRectPerDimMinX = nrRectPerDimMinX;
00060         mNrRectPerDimMinY = nrRectPerDimMinY;
00061         mNrRectPerDimMaxX = nrRectPerDimMaxX;
00062         mNrRectPerDimMaxY = nrRectPerDimMaxY;
00063         mNrRectStepSizeX = nrRectStepSizeX;
00064         mNrRectStepSizeY = nrRectStepSizeY;
00065 
00066         int nr;
00067         for (nr=mNrRectPerDimMinX ; nr<=mNrRectPerDimMaxX ;
00068              nr+=mNrRectStepSizeX)
00069         {
00070             mNrRectsPerDimX.push_back(nr);
00071         }
00072         for (nr=mNrRectPerDimMinY ; nr<=mNrRectPerDimMaxY ;
00073              nr+=mNrRectStepSizeY)
00074         {
00075             mNrRectsPerDimY.push_back(nr);
00076         }
00077 
00078         for (nr=0; nr<NrLevels();nr++)
00079         {
00080             // create an empty container for each level
00081             mRectSet.push_back(RectangleSet());
00082         }
00083 
00084         // make sure to have equal pyramid levels, for both dimensions
00085         // repeat highest known level, if neccecary
00086         int levelDiff = mNrRectsPerDimX.size() - mNrRectsPerDimY.size();
00087         while (levelDiff > 0)
00088         {
00089             nr = mNrRectsPerDimY[mNrRectsPerDimY.size()-1];
00090             mNrRectsPerDimY.push_back(nr);
00091             levelDiff--;
00092         }
00093         while (levelDiff < 0)
00094         {
00095             nr = mNrRectsPerDimX[mNrRectsPerDimX.size()-1];
00096             mNrRectsPerDimX.push_back(nr);
00097             levelDiff++;
00098         }
00099 
00100 
00101         if((imWidth >=0) && (imHeight >= 0)) {
00102             /* do something with the passed imWidth and imHeight */
00103             SetImageSize(imWidth, imHeight);
00104         }
00105     }
00106 
00107     void
00108     SetImageSize(int imWidth, int imHeight)
00109     {
00110         if (mBorderWidth == -1)
00111             return;
00112         if ((imWidth == mImWidth) && (imHeight == mImHeight))
00113             return;
00114         mImWidth = imWidth;
00115         mImHeight = imHeight;
00116         for (int i=0 ; i<mRectSet.size() ; i++)
00117         {
00118             mRectSet[i].clear();
00119             MakeSubRects(std::back_inserter(mRectSet[i]),
00120                          mImWidth, mImHeight, mBorderWidth,
00121                          mNrRectsPerDimX[i], mNrRectsPerDimY[i],
00122                          mRegionOverlapRatio);
00123         }
00124     }
00125 
00126     int
00127     NrLevels()
00128     {
00129         // x and y should have equal level, chose the largest
00130         return ( mNrRectsPerDimX.size() > mNrRectsPerDimY.size()
00131                  ? mNrRectsPerDimX.size() : mNrRectsPerDimY.size() );
00132     }
00133 
00134     int
00135     NrRectsPerDimX(int level)
00136     {
00137         return mNrRectsPerDimX[level];
00138     }
00139 
00140     int
00141     NrRectsPerDimY(int level)
00142     {
00143         return mNrRectsPerDimY[level];
00144     }
00145 
00146     int
00147     TotalNrRects()
00148     {
00149         if (mNrRectPerDimMinX == -1)
00150             return 0;
00151         int level, sum = 0;
00152         for (level=0 ; level<NrLevels();level++)
00153         {
00154             int nrX = (mNrRectsPerDimX[level]-1)/(1.0-mRegionOverlapRatio) + 1;
00155             int nrY = (mNrRectsPerDimY[level]-1)/(1.0-mRegionOverlapRatio) + 1;
00156             sum += nrX*nrY;
00157         }
00158         return sum;
00159     }
00160 
00161     int
00162     NrRects(int level)
00163     {
00164         if (mRectSet[level].size() != 0) // known image size, so exact number
00165             return mRectSet[level].size();
00166 
00167         int nrX = (mNrRectsPerDimX[level]-1)*(1.0-mRegionOverlapRatio) + 1;
00168         int nrY = (mNrRectsPerDimY[level]-1)*(1.0-mRegionOverlapRatio) + 1;
00169         return nrX*nrY; // unknown image size, but should be this
00170     }
00171 
00172     Rectangle
00173     Rect(int level, int nr)
00174     {
00175         return mRectSet[level][nr];
00176     }
00177 
00178     int
00179     GetBorderWidth()
00180     {
00181         return mBorderWidth;
00182     }
00183 
00184     int
00185     GetImWidth()
00186     {
00187         return mImWidth;
00188     }
00189 
00190     int
00191     GetImHeight()
00192     {
00193         return mImHeight;
00194     }
00195 
00196     String
00197     AsDefString()
00198     {
00199         String res;
00200         for (int i=0 ; i<mNrRectsPerDimX.size() ; i++)
00201         {
00202             if (i != 0)
00203                 res += "-";
00204             res += MakeString(mNrRectsPerDimX[i]);
00205             res += "x";
00206             res += MakeString(mNrRectsPerDimY[i]);
00207         }
00208         return res;
00209     }
00210 
00211     void
00212     Dump()
00213     {
00214         std::cout << "RectanglePyramid" << std::endl;
00215         for (int l=0 ; l<NrLevels() ; l++)
00216         {
00217             std::cout << "l=" << l << ", nrRects=" << NrRectsPerDimX(l) << "x"
00218                       << NrRectsPerDimY(l) << " = " << NrRects(l) << std::endl;
00219             for (int r=0 ; r<NrRects(l) ; r++)
00220             {
00221                 std::cout << "   r=" << r << " : " << Rect(l, r) << std::endl;
00222             }
00223         }
00224     }
00225 
00226 private:
00227 
00228     int                       mImWidth;
00229     int                       mImHeight;
00230     int                       mBorderWidth;
00231 
00232     int                       mNrRectPerDimMinX;
00233     int                       mNrRectPerDimMaxX;
00234     int                       mNrRectStepSizeX;
00235 
00236     int                       mNrRectPerDimMinY;
00237     int                       mNrRectPerDimMaxY;
00238     int                       mNrRectStepSizeY;
00239 
00240 
00241     double                    mRegionOverlapRatio; // ratio of rectangle overlap
00242 
00243     std::vector<RectangleSet> mRectSet;  // set of rectangles for each level
00244 
00245     std::vector<int>          mNrRectsPerDimX; // nr rects per dim for each level
00246     std::vector<int>          mNrRectsPerDimY; // nr rects per dim for each level
00247 
00248 };
00249 
00250 } // namespace Geometry
00251 } // namespace Core
00252 } // namespace Impala
00253 
00254 #endif

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