void ROIFinder::_updateSubArea( const uint8_t type ) { LBASSERT( type <= 16 ); if( type == 0 ) return; PixelViewport pvp; switch( type ) { case 1: pvp = PixelViewport( _dim.x1,_dim.y2,_dim.w1,_dim.h2 ); break; case 2: pvp = PixelViewport( _dim.x2,_dim.y3,_dim.w2,_dim.h3 ); break; case 3: pvp = PixelViewport( _dim.x3,_dim.y2,_dim.w3,_dim.h2 ); break; case 4: pvp = PixelViewport( _dim.x2,_dim.y1,_dim.w2,_dim.h1 ); break; case 5: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w1,_dim.h4 ); break; case 6: pvp = PixelViewport( _dim.x1,_dim.y3,_dim.w4,_dim.h3 ); break; case 7: pvp = PixelViewport( _dim.x3,_dim.y2,_dim.w3,_dim.h5 ); break; case 8: pvp = PixelViewport( _dim.x2,_dim.y1,_dim.w5,_dim.h1 ); break; case 9: pvp = PixelViewport( _dim.x1,_dim.y2,_dim.w1,_dim.h5 ); break; case 10: pvp = PixelViewport( _dim.x2,_dim.y3,_dim.w5,_dim.h3 ); break; case 11: pvp = PixelViewport( _dim.x3,_dim.y1,_dim.w3,_dim.h4 ); break; case 12: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w4,_dim.h1 ); break; case 13: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w1,_dim.h6 ); break; case 14: pvp = PixelViewport( _dim.x3,_dim.y1,_dim.w3,_dim.h6 ); break; case 15: pvp = PixelViewport( _dim.x1,_dim.y3,_dim.w6,_dim.h3 ); break; case 16: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w6,_dim.h1 ); break; default: LBUNIMPLEMENTED; } LBASSERT( pvp.hasArea( )); LBASSERT( pvp.x >=0 && pvp.y >=0 && pvp.x+pvp.w <=_w && pvp.y+pvp.h <=_h ); Area& a = _tmpAreas[type]; a.pvp = _getObjectPVP( pvp, &_mask[0] ); a.hole = _emptyFinder.getLargestEmptyArea( a.pvp ); a.emptySize = pvp.getArea() - a.pvp.getArea() + a.hole.getArea(); #ifndef NDEBUG LBASSERT( !a.valid ); a.valid = true; #endif }
bool ROITracker::useROIFinder( const PixelViewport& pvp, const uint32_t stage, const uint128_t& frameID, uint8_t*& ticket ) { LBASSERT( !_needsUpdate ); ticket = 0; const uint32_t pvpArea = pvp.getArea(); if( pvpArea < 100 ) return false; if( _lastFrameID != frameID ) // new frame { stde::hash_map< uint32_t, Stage >* tmp = _prvFrame; _prvFrame = _curFrame; _curFrame = tmp; _curFrame->clear(); _lastFrameID = frameID; } _lastStage = stage; Stage& curStage = (*_curFrame)[ stage ]; // check if proper stage is avaliable if( _prvFrame->find( stage ) == _prvFrame->end( )) // new stage { curStage.areas.push_back( Area( pvp )); return _returnPositive( ticket ); } //else existing stage, try to find matching area const Area* match = 0; uint32_t bestArea = 0; const Stage& prvStage = (*_prvFrame)[ stage ]; for( uint32_t i = 0; i < prvStage.areas.size(); i++ ) { PixelViewport tmp = prvStage.areas[i].pvp; tmp.intersect( pvp ); const uint32_t area = tmp.getArea(); if( area > bestArea ) { bestArea = area; match = &prvStage.areas[i]; if( area == pvpArea ) // full match break; } } if( bestArea < pvpArea*2/3 ) // no proper match found, new area { curStage.areas.push_back( Area( pvp )); return _returnPositive( ticket ); } // else good match if( match->skip == 0 ) // don't skip frame { curStage.areas.push_back( Area( pvp, match->lastSkip )); return _returnPositive( ticket ); } //else skip frame curStage.areas.push_back( Area( pvp, match->lastSkip, match->skip-1 )); return false; }