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, ®ion ); // 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; }