Example #1
0
void CvParticleFilter::initialize(CvRect roi)
{
  // initialize particle filter  
  CvParticle * init_particle = cvCreateParticle( N_p/*num_states*/, 1 );
  float lin = m_imsize.width/160.f;
  float bound = 5.*lin;
  float m_iLinMultiplier=m_imgY->width/160.;
  fprintf(stderr, "roi: %d,%d,%d,%d\n", roi.x,roi.y,roi.width,roi.height);
  if ( (roi.x<1) || (roi.y<1) ||
       (roi.width >m_imsize.width-1) ||
       (roi.height>m_imsize.height-1) )
  {
    fprintf(stderr, "WARNING: initializing at image boundary, rejected!\n");
    return;
  }
  CvRect initROI = cvRect(roi.x+bound,
                          roi.y+bound,
                          roi.width -bound*2.,
                          roi.height-bound*2.);
  CvBox2D box = cvBox2DFromRect( initROI ); // centerize

  cvParticleStateSet( init_particle, 0, box );
  cvParticleInit( m_particle, init_particle );
  cvReleaseParticle( &init_particle );

  {
    float dx=1.8,dy=1.8,dw=.01,dh=.01,dtheta=.05;
    CvBox2D box = cvBox2D(dx*lin, dy*lin, dw*lin, dh*lin, dtheta);
    cvParticleStateConfig( m_particle, m_imsize, box);
  }

  {
    // CvMat * imgYpatch  =
    //     cvCreateMat(initROI.height, initROI.width, CV_8U);
    // CvMat * imgUpatch  =
    //     cvCreateMat(initROI.height, initROI.width, CV_8U);
    // CvMat * imgVpatch  =
    //     cvCreateMat(initROI.height, initROI.width, CV_8U);
    // cvGetSubRect(m_imgY, imgYpatch, initROI);
    // cvGetSubRect(m_imgU, imgUpatch, initROI);
    // cvGetSubRect(m_imgV, imgVpatch, initROI);
    // // CV_SHOW(imgYpatch);
    // m_observer.update(imgYpatch, imgUpatch, imgVpatch);

    // int pnr=(roi.height/2)*2,pnc=(roi.width/2)*2;
    // CvMat * imgYpatch = cvCreateMat(pnr, pnc, CV_8U);
    // CvMat * imgUpatch = cvCreateMat(pnr, pnc, CV_8U);
    // CvMat * imgVpatch = cvCreateMat(pnr, pnc, CV_8U);
    // CvMat * mask = cvCreateMat(pnr, pnc, CV_8U);
    // float warp_p_data[3]={1,roi.x,roi.y};
    // CvMat warp_p = cvMat(3,1,CV_32F,warp_p_data);
    // icvWarp(m_imgY, imgYpatch, &warp_p);
    // icvWarp(m_imgU, imgUpatch, &warp_p);
    // icvWarp(m_imgV, imgVpatch, &warp_p);

    // CvMat * subdx = cvCreateMat(pnr, pnc, CV_8U);
    // CvMat * subdy = cvCreateMat(pnr, pnc, CV_8U);
    // icvWarp(m_tracker.dx, subdx, &warp_p);
    // icvWarp(m_tracker.dy, subdy, &warp_p);

    // m_observer.update(imgYpatch, imgUpatch, imgVpatch, mask);
    m_observer.initialize(roi);

    // cvReleaseMat(&subdx);
    // cvReleaseMat(&subdy);

    // cvReleaseMat(&imgYpatch);
    // cvReleaseMat(&imgUpatch);
    // cvReleaseMat(&imgVpatch);
    // cvReleaseMat(&mask);
  }
    
  m_initialized = 1;
}
/**************************** Main ********************************/
int main( int argc, char** argv )
{
    IplImage *frame;
    CvCapture* video;
    int frame_num = 0;
    int i;

    arg_parse( argc, argv );

    // initialization
    cvParticleObserveInitialize( featsize );

    // read a video
    if( !vid_file || (isdigit(vid_file[0]) && vid_file[1] == '\0') )
        video = cvCaptureFromCAM( !vid_file ? 0 : vid_file[0] - '0' );
    else
        video = cvCaptureFromAVI( vid_file ); 
    if( (frame = cvQueryFrame( video )) == NULL )
    {
        fprintf( stderr, "Video %s is not loadable.\n", vid_file );
        usage();
        exit(1);
    }

    // allows user to select initial region
    CvRect region;
    icvGetRegion( frame, &region );

    // configure particle filter
    bool logprob = true;
    CvParticle *particle = cvCreateParticle( num_states, num_particles, logprob );
    CvParticleState std = cvParticleState (
        std_x,
        std_y,
        std_w,
        std_h,
        std_r
    );
    cvParticleStateConfig( particle, cvGetSize(frame), std );

    // initialize particle filter
    CvParticleState s;
    CvParticle *init_particle;
    init_particle = cvCreateParticle( num_states, 1 );
    CvRect32f region32f = cvRect32fFromRect( region );
    CvBox32f box = cvBox32fFromRect32f( region32f ); // centerize
    s = cvParticleState( box.cx, box.cy, box.width, box.height, 0.0 );
    cvParticleStateSet( init_particle, 0, s );
    cvParticleInit( particle, init_particle );
    cvReleaseParticle( &init_particle );

    // template
    IplImage* reference = cvCreateImage( featsize, frame->depth, frame->nChannels );
    IplImage* tmp = cvCreateImage( cvSize(region.width,region.height), frame->depth, frame->nChannels );
    cvCropImageROI( frame, tmp, region32f );
    cvResize( tmp, reference );
    cvReleaseImage( &tmp );

    while( ( frame = cvQueryFrame( video ) ) != NULL )
    {
        // Draw new particles
        cvParticleTransition( particle );
        // Measurements
        cvParticleObserveMeasure( particle, frame, reference );

        // Draw all particles
        for( i = 0; i < particle->num_particles; i++ )
        {
            CvParticleState s = cvParticleStateGet( particle, i );
            cvParticleStateDisplay( s, frame, CV_RGB(0,0,255) );
        }
        // Draw most probable particle
        //printf( "Most probable particle's state\n" );
        int maxp_id = cvParticleGetMax( particle );
        CvParticleState maxs = cvParticleStateGet( particle, maxp_id );
        cvParticleStateDisplay( maxs, frame, CV_RGB(255,0,0) );
        ///cvParticleStatePrint( maxs );
        
        // Save pictures
        if( arg_export ) {
            sprintf( export_filename, export_format, vid_file, frame_num );
            printf( "Export: %s\n", export_filename ); fflush( stdout );
            cvSaveImage( export_filename, frame );
        }
        cvShowImage( "Select an initial region > SPACE > ESC", frame );

        // Normalize
        cvParticleNormalize( particle);
        // Resampling
        cvParticleResample( particle );

        char c = cvWaitKey( 1000 );
        if(c == '\x1b')
            break;
    }

    cvParticleObserveFinalize();
    cvDestroyWindow( "Select an initial region > SPACE > ESC" );
    cvReleaseImage( &reference );
    cvReleaseParticle( &particle );
    cvReleaseCapture( &video );
    return 0;
}