コード例 #1
0
ファイル: roiFinder.cpp プロジェクト: BillTheBest/Equalizer
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
}
コード例 #2
0
ファイル: roiTracker.cpp プロジェクト: Angels-group/Equalizer
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;
}