#include <HxImgFtorQueueBased.h>
Inheritance diagram for HxImgFtorQueueBased::
Public Types | |
typedef FunctorT::QT | QueueT |
typedef FcvArray< PointT > | VecPointT |
typedef FunctorT::VecNeighbors | VecNeighborT |
Public Methods | |
HxImgFtorQueueBased () | |
~HxImgFtorQueueBased () | |
virtual void | doIt (Img1DataPtrType imgPtr, Img2DataPtrType extraPtr, Img3DataPtrType anotherPtr, HxSizes imgSize, HxSizes extraSize, HxSizes anotherSize, HxTagList &tags, HxImgFtorDescription *=0) |
doIt is implemented by derived image functors:. More... | |
void | fillNeighborValues (const PointT ¢ralPoint, int connectivity, VecNeighborT &vecneighbors, const HxSizes &imgSize, const Img1DataPtrType &imgPtr, const Img2DataPtrType &extraPtr, const Img3DataPtrType &anotherPtr) |
Static Public Methods | |
HxString | className () |
void | fillNeighborValues (PointT centralPoint, const VecPointT &neighborCoordinates, VecNeighborT &vecneighbors, HxSizes imgSize, Img1DataPtrType imgPtr, Img2DataPtrType extraPtr, Img3DataPtrType anotherPtr) |
void | createNeighborCoordinates (VecPointT &neighborCoordinates, HxTagList &tags) |
Public Attributes | |
QueueT | queuet |
|
doIt is implemented by derived image functors:.
Reimplemented from HxImgFtorI3Cast.
00141 { 00142 00143 SHOW(imgSize); SHOW(extraSize); SHOW(anotherSize); SHOW(tags); 00144 if (!(imgSize==extraSize && imgSize==anotherSize)) { 00145 HxString err("ERROR: unequal sizes in "); 00146 // err+=typeid(*this).name(); 00147 throw err; 00148 } 00149 HxAddTag(tags, "imgSize", imgSize); // need it for debugging 00150 00151 00152 int imgsizex = imgSize.x(); 00153 int imgsizey = imgSize.y(); 00154 int imgsizez = imgSize.z(); if (imgsizez!=1) throw HxString("QueueBeased pattern not (yet) certified for imgsizez!=1"); 00155 FunctorT functor(tags, imgsizex, imgsizey); 00156 SHOW(typeid(*this).name()); 00157 00158 int connectivity=HxGetTag(tags, "connectivity", 8); 00159 // std::cout << "connectivity=" <<connectivity<<std::endl; 00160 00161 // GLOBAL INIT 00162 { // local scope 00163 if (!queuet.empty()) { // debug only 00164 SHOW(queuet.size()); // uhhhhhhhhhhhhhhhhhhh 00165 queuet.clear(); 00166 } 00167 Img1DataPtrType d=imgPtr; 00168 Img2DataPtrType s1=extraPtr; 00169 Img3DataPtrType s2=anotherPtr; 00170 for (int y=0; y<imgsizey; y++) { 00171 for (int x=0 ; x<imgsizex; x++) { 00172 typename FunctorT::PointValueT vp; 00173 PointT p(x, y); 00174 vp.point=p; 00175 typename ImgSigT::ArithType dest=d.read(); 00176 typename ExtraSigT::ArithType src1=s1.read(); 00177 typename AnotherSigT::ArithType src2=s2.read(); 00178 bool q=functor.globalPixelInit(vp, dest, src1, src2); 00179 if (q) queuet.push(vp); // NOTE: bool ok=queue.insert(vp).second is NEVER false 00180 d.write(dest); 00181 d.incX(); s1.incX(); s2.incX(); 00182 } 00183 d.decX(imgsizex); s1.decX(imgsizex); s2.decX(imgsizex); 00184 d.incY(); s1.incY(); s2.incY(); 00185 } 00186 } // end local scope 00187 00188 // NEW: array of points to simplify loop 4/8/... connectivity, now skip (0,0,0) 00189 FcvArray<PointT> neighborCoordinates; 00190 createNeighborCoordinates(neighborCoordinates, tags); 00191 00192 // clear speedup startpoint for localPixelInit() in large do while loop 00193 //__asm int 3 00194 PointT startpoint(0,0); 00195 00196 typename FunctorT::VecNeighbors vecneighbors; 00197 00198 00199 // LOOP until done with INIT local + PROPAGATE 00200 do { 00201 00202 // INIT: FILL QUEUE 00203 { // local scope 00204 bool freshstart=functor.wantFreshStartLocalPixelInit(); 00205 if (freshstart) { 00206 startpoint.x=0; 00207 startpoint.y=0; 00208 } 00209 Img1DataPtrType d=imgPtr; 00210 Img2DataPtrType s1=extraPtr; 00211 Img3DataPtrType s2=anotherPtr; 00212 bool continueloop=true; 00213 int x=startpoint.x; 00214 int y=startpoint.y; 00215 d.incXYZ(x, y); 00216 s1.incXYZ(x, y); 00217 s2.incXYZ(x, y); 00218 bool wenttonewpoint=false; 00219 if (wenttonewpoint) y=0; 00220 for (; y<imgsizey; y++) { 00221 if (wenttonewpoint) x=0; 00222 for (; x<imgsizex; x++) { 00223 if (!wenttonewpoint) { 00224 wenttonewpoint=true; 00225 } 00226 typename FunctorT::PointValueT vp; 00227 vp.point.x=x; 00228 vp.point.y=y; 00229 typename ImgSigT::ArithType dest=d.read(); 00230 typename ExtraSigT::ArithType src1=s1.read(); 00231 typename AnotherSigT::ArithType src2=s2.read(); 00232 bool q=functor.localPixelInit(vp, dest, src1, src2, continueloop); 00233 if (q) queuet.push(vp); // NOTE: bool ok=queue.insert(vp).second is NEVER false 00234 d.write(dest); 00235 if (!continueloop) break; 00236 d.incX(); s1.incX(); s2.incX(); 00237 } 00238 if (!continueloop) break; 00239 d.decX(imgsizex); s1.decX(imgsizex); s2.decX(imgsizex); 00240 d.incY(); s1.incY(); s2.incY(); 00241 } 00242 // rememmber startpoint for next time 00243 startpoint.x=x; 00244 startpoint.y=y; 00245 00246 } // end local scope 00247 00248 // PROPAGATION 00249 { // local scope 00250 while (!queuet.empty()) { // line 4 00251 typename FunctorT::PointValueT vp(queuet.top()); queuet.pop(); // line 5 00252 00253 // give functor first=this=center data 00254 { // local scope 00255 int tempx=vp.point.x, tempy=vp.point.y; 00256 Img1DataPtrType d=imgPtr; 00257 Img2DataPtrType s1=extraPtr; 00258 Img3DataPtrType s2=anotherPtr; 00259 d.incXYZ(tempx, tempy); 00260 s1.incXYZ(tempx, tempy); 00261 s2.incXYZ(tempx, tempy); 00262 functor.first(vp, d.read(), s1.read(), s2.read()); 00263 } // local scope 00264 00265 // give functor the neighbour pixels 00266 // NOT yet optimized for iterator++ or LUT for coords 00267 // NEW: use vector to pass neighbors, here be compatible with sequential code 00268 { //local scope 00269 fillNeighborValues( 00270 vp.point, 00271 neighborCoordinates, 00272 //connectivity, 00273 vecneighbors, 00274 imgSize, 00275 imgPtr, 00276 extraPtr, 00277 anotherPtr); 00278 // CALCULATE put functor to work, might be removed by first call to getdata() 00279 functor.calculate(vecneighbors); 00280 } //local scope 00281 00282 00283 00284 // read out phase, might have many values of different types 00285 { // local scope 00286 typename FunctorT::ActionT action; 00287 while ((action=functor.result3())!=FunctorT::stopAction) { 00288 switch (action) { 00289 case FunctorT::queueAction: 00290 { // local scope 00291 typename FunctorT::PointValueT vp; 00292 functor.getItemToQueue(vp); 00293 queuet.push(vp); 00294 } // local scope 00295 break; 00296 case FunctorT::removeAction: 00297 { // local scope 00298 typename FunctorT::PointValueT low, high; 00299 functor.getItemToRemove(low, high); 00300 typename QueueT::iterator lowiter=queuet.lower_bound(low); 00301 typename QueueT::iterator highiter=queuet.after_upper_bound(high); 00302 for (typename QueueT::iterator iter=lowiter; iter!=highiter; iter++) { 00303 bool k=functor.killThisOne(*iter); 00304 if (k) { 00305 queuet.erase(iter); 00306 break; 00307 } 00308 } 00309 } // local scope 00310 break; 00311 case FunctorT::writeAction: 00312 { // local scope 00313 Img1DataPtrType p=imgPtr; 00314 PointT point; 00315 typename ImgSigT::ArithType arith; 00316 functor.getItemToWrite(point, arith); 00317 p.incXYZ(point.x, point.y); 00318 p.write(arith); 00319 } // local scope 00320 break; 00321 default: throw HxString("ERROR switch (action) default:"); 00322 }; // switch (action) 00323 } // while ((action=functor.result3())!=FunctorT::stopAction) 00324 } // local scope 00325 } // while (!queuet.empty()) 00326 } // end local scope PROPAGATION 00327 } while (functor.wantAnotherLoop()); 00328 00329 00330 } |