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
00081 mRectSet.push_back(RectangleSet());
00082 }
00083
00084
00085
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
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
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)
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;
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;
00242
00243 std::vector<RectangleSet> mRectSet;
00244
00245 std::vector<int> mNrRectsPerDimX;
00246 std::vector<int> mNrRectsPerDimY;
00247
00248 };
00249
00250 }
00251 }
00252 }
00253
00254 #endif