void HoughAccumulator::Init()
{
	int* sizes = new int[paramRanges.size()];
	for (unsigned int i = 0; i < paramRanges.size(); i++)
		sizes[i] = (paramRanges[i].max - paramRanges[i].min) * precision;
	
//	acc = cvCreateSparseMat( paramRanges.size(), sizes, CV_8UC1);
	acc = cvCreateMatND(paramRanges.size(), sizes, CV_8UC1);
	cvZero(acc);
	indices = new int[paramRanges.size()];
	delete[] sizes;
}
Ejemplo n.º 2
0
int main(int argc, char * argv[])
{
  typedef struct {char buffer[512];char fn[256];float x,y,w,h;} CvTrainData;
  char imagelistfn[2][256];
  sprintf(imagelistfn[0],"../dataset/palm/open.txt");
  sprintf(imagelistfn[1],"../dataset/palm/close.txt");
  char featurefn[2][256];
  sprintf(featurefn[0],"../data/open.bin");
  sprintf(featurefn[1],"../data/close.bin");

  int statusiter=0;
  for (statusiter=0;statusiter<2;statusiter++)
  {
  
  int i,j,N;
  CvTrainData dat[MAX_SAMPLES];
  {
  FILE * fp = fopen(imagelistfn[statusiter], "r");
  for (i=0;i<MAX_SAMPLES;i++) {
    fgets(dat[i].buffer,512,fp);
    if (dat[i].buffer[0]=='-'){break;}
    if (dat[i].buffer[0]=='#'){i--;continue;}
    sscanf(dat[i].buffer, "%s %f %f %f %f\n",
           dat[i].fn,&dat[i].x,&dat[i].y,&dat[i].w,&dat[i].h);
#if WITH_TZG
    dat[i].x=dat[i].x+cvRound(dat[i].w*.15);
    dat[i].y=dat[i].y+cvRound(dat[i].h*.15);
    dat[i].w=cvRound(dat[i].w*.7);
    dat[i].h=cvRound(dat[i].h*.7);
#endif
  }
  fprintf(stderr, "INFO: %d training dat collected!\n", i);
  fclose(fp);
  }
  N=i;

  float * hogfts_data = new float[378*MAX_SAMPLES];
  CvMat hogfts = cvMat(MAX_SAMPLES,378,CV_32F,hogfts_data);
  
  int hogsizes[]={7,6,9};
  int hogszprod = hogsizes[0]*hogsizes[1]*hogsizes[2];
  for (i=0;i<N;i++)
  {
    IplImage * img = cvLoadImage(dat[i].fn,0);
    CvMat mat_stub;
    CvMat * mat = cvGetMat(img,&mat_stub);
    CvMatND * hog = cvCreateMatND(3,hogsizes,CV_32F);
    int nr=mat->rows,nc=mat->cols;
    CvMat * dx = cvCreateMat(nr,nc,CV_16S);
    CvMat * dy = cvCreateMat(nr,nc,CV_16S);
    CvMat * magni = cvCreateMat(nr,nc,CV_32F); cvZero(magni);
    CvMat * angle = cvCreateMat(nr,nc,CV_32F); cvZero(angle);
    float warp_p_data[]={dat[i].w/36.,dat[i].x-3.,dat[i].y-3.};
    CvMat warp_p = cvMat(3,1,CV_32F,warp_p_data);

    // cvSobel(img,dx,1,0,1);
    // cvSobel(img,dy,0,1,1);
    cvPrepareGradientROI(mat, dx, dy, warp_p_data[0],
                         cvRect(dat[i].x,dat[i].y,dat[i].w,dat[i].h));
    
    cvSet(magni,cvScalar(-1));

    icvCalcWarpHOG(mat,&warp_p,hog,6,2,dx,dy,magni,angle);
    // for (j=0;j<hogszprod;j++){ fprintf(stderr, "%ff,", hog->data.fl[j]); }
    // icvShowHOG(hog); CV_WAIT();

    memcpy(hogfts_data+378*i,hog->data.fl,sizeof(float)*378);

    // icvShowHOG(hog); CV_WAIT();
    // fprintf(stderr, "scale: %f\n", warp_p_data[0]);
    if (argc>1) { if (!strcmp(argv[1],"-show")){
      // fprintf(stderr, "INFO: file %s loaded!\n", dat[i].fn);
      cvRectangle(mat,cvPoint(dat[i].x,dat[i].y),
                  cvPoint(dat[i].x+dat[i].w,dat[i].y+dat[i].h),CV_RED);
      fprintf(stderr, "INFO: display %s\n",dat[i].fn);
      CV_SHOW(mat);
      }
    }
    // CV_SHOW(magni);
    // CV_SHOW(angle);

    cvReleaseMat(&dx);
    cvReleaseMat(&dy);
    cvReleaseMat(&magni);
    cvReleaseMat(&angle);
    cvReleaseMatND(&hog);
  }

  {
    FILE * fp=fopen(featurefn[statusiter],"w");
    fwrite(hogfts_data,4,378*i,fp);
    fclose(fp);
  }
  delete [] hogfts_data;

  }
  
  return 0;
}
int main( int argc, char *argv[] ) {

    int webcamRun = 0;
    
    CvCapture *capture = 0;
    CvCapture *stereoCapture = 0;
    
    CvCapture **cptPtr = &capture;
    CvCapture **scptPtr = &stereoCapture;
    
    initCaptureFiles( argc, argv, cptPtr, scptPtr, &webcamRun, &enable3D );
  
  
  
  char locationMean[300];
  char locationCov[300];
  strncpy( locationMean, argv[1], 300 );
  strncpy(  locationCov, argv[2], 300 );
  
  
  
  /* check for stereo file */  
  
  
  
  if( !enable3D ) {
    displayStereoFrame   = 0;
    displayPositionFrame = 0;
    depthScaling         = 0;
  }
  
    
  /* Fast-forwards through the video to the action */
  int kl;
  for( kl = 0; kl < 100 && webcamRun == 0; kl++ ) {
    cvQueryFrame( capture );
    if( enable3D ) cvQueryFrame( stereoCapture );
  }
    
    
  /*
      Housekeeping
  */
  
  int maxBox[10];
  // this should be in the relevant file
  //! Create matrix files to hold intermediate calculations for likelihood
  
  
  
  


  /* this should have its own matrix setup function and not be hard-coded */
  //! Create N-dimensional matrices to hold mean and cov data
  int backMeanSizes[] = {_sizeY,_sizeX,4,_numResponses};
  int backCovSizes[]  = {_sizeY,_sizeX,4,_numResponses};

  CvMatND *backMean = cvCreateMatND( 4, backMeanSizes, CV_32F );
  CvMatND *backCov  = cvCreateMatND( 4, backCovSizes,  CV_32F );

  /* Fix this */
  if( webcamRun ) {
    backMean = (CvMatND*) cvLoad( "D:/Will/Dropbox/My Dropbox/Project/Matlab/backMean.xml", NULL, NULL, NULL );
    backCov  = (CvMatND*) cvLoad( "D:/Will/Dropbox/My Dropbox/Project/Matlab/backCov.xml", NULL, NULL, NULL );
  } else {
    backMean = (CvMatND*) cvLoad( locationMean, NULL, NULL, NULL );
    backCov  = (CvMatND*) cvLoad( locationCov, NULL, NULL, NULL );
  }
  
  /* end here */
  
  
  CvMat *imgLikelihood = cvCreateMat( 48, 64, CV_32F );
  


  img  = cvLoadImage( "foreground8/image (1).jpg", CV_LOAD_IMAGE_COLOR );
  yImg = cvLoadImage( "foreground8/image (1).jpg", CV_LOAD_IMAGE_COLOR );
  cvNamedWindow( "Tracker", CV_WINDOW_AUTOSIZE );
  
  
  /* Condensation stuff */
  ConDens = cvCreateConDensation( DP, MP, nSamples );
  
  bx = 320; by = 240;
	//hm = 0; //vm = 0;

  /* Initialize the random number generator */
	rng_state = cvRNG(0xffffffff);
 
  initializeCondensation();
  
  /* This allows us to change the probabiity with which Condensation alters each variable */
  cvRandInit( &(ConDens->RandS[0]), -75, 75, 0, CV_RAND_UNI);
  cvRandInit( &(ConDens->RandS[1]),  -5,  5, 1, CV_RAND_UNI);
  cvRandInit( &(ConDens->RandS[2]),  -5,  5, 2, CV_RAND_UNI);
  cvRandInit( &(ConDens->RandS[3]),  -2,  2, 3, CV_RAND_UNI);
  
  cvRandInit( &(ConDens->RandS[4]), -75, 75, 4, CV_RAND_UNI);
  cvRandInit( &(ConDens->RandS[5]),  -5,  5, 5, CV_RAND_UNI);
  cvRandInit( &(ConDens->RandS[6]),  -5,  5, 6, CV_RAND_UNI);
  cvRandInit( &(ConDens->RandS[7]),  -2,  2, 7, CV_RAND_UNI);
  
  /*
    If we have depth scaling, the depth controls the width & height of the box
    So we don't want any randomness
  */
  if( depthScaling ) {
    cvRandInit( &(ConDens->RandS[3]),  0,  0, 3, CV_RAND_UNI);
    cvRandInit( &(ConDens->RandS[7]),  0,  0, 7, CV_RAND_UNI);
  }

  
  IplImage* heatFrame = NULL;
  heatFrame = cvQueryFrame( capture );
  if(enable3D) cvQueryFrame( stereoCapture ); // making sure they stay in sync (and init positionFrame)
  
  
  int frameNumb = 0;
  // int mjk;
  // for( mjk = 0; mjk < 320; mjk++ ) {
    // cvQueryFrame( capture );
    // cvQueryFrame( stereoCapture );
    // frameNumb++;
  // }
  

  
  positionFrame = cvCreateImage(cvSize(640, 510), 8, 3);
  
  
  int trailLength = 20;
  int planX1Pos[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  int planX2Pos[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  int planZ1Pos[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  int planZ2Pos[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  

  int key = 0;
  double totalTime = 0;
  int totalFrames = 0;
  
  
  
  while( key != 'q' ) {
  
    // stopCount++;
    // strcpy(frameNameTemp, frameName);
    // itoa(stopCount, frameCount, 10);
    // strcat( frameNameTemp, frameCount);
    // strcat(frameNameTemp, ".jpg");
    // cvSaveImage(frameNameTemp, positionFrame, 0);
    
    
    /* Start timing */
    clock_t start = clock();
        
        frameNumb++;
        printf("Frame %d\n", frameNumb);
        if( frameNumb == 210 ) {
          for( ; frameNumb < 290; frameNumb++ ) {
            cvQueryFrame( capture );
            cvQueryFrame( stereoCapture );
          }
        }
        
        if( frameNumb == 350 ) {
          return(0);
        }
        
        /* Get the first video frame, and maybe stereo frame */
        frame = cvQueryFrame( capture );
        if(enable3D) stereoFrame = cvQueryFrame( stereoCapture );
        
        
        /* Double-check that we haven't reached the end */
        if( !frame ) break;
        if( enable3D ) if( !stereoFrame ) break;
        
        
        /* Compute likelihoods for new frame, using mean and cov */
        likelihood( frame, backMean, backCov, imgLikelihood );
        
        /* Update the Condensation model using new likelihoods */
        updateCondensation( 0, 0, imgLikelihood, maxBox );

        /* Maybe display the Condensation particles */
        if( displayParticles ) 
          drawParticles();

        /* Draw tracking boxes onto the video and stereo video frame */
        drawTrackingBoxes( 0, maxBox, frame, stereoFrame );
        drawTrackingBoxes( 1, maxBox, frame, stereoFrame );

        /* Show the latest video frame (with boxes and particles) */
        cvShowImage( "Tracker", frame );

        /* Maybe show latest stereo depth frame */
        if( displayStereoFrame )
          cvShowImage( "Stereo", stereoFrame );
      
        /* Maybe show latest position map */
        if( displayPositionFrame )
          drawPositionTrail( maxBox, trailLength, 
                             depth, 
                             planX1Pos, planX2Pos, planZ1Pos, 
                             planZ2Pos, positionFrame );
        
        /* Maybe show the heat map of the input image (the likelihood for each patch) */
        if( displayHeatFrame ) {
          drawHeatmap( maxBox, imgLikelihood, heatFrame );
          cvShowImage( "Heat", heatFrame );
        }
        
        /* Update previous x, y positions */
        prevX[0] = maxBox[0]; prevY[0] = maxBox[1];
        prevX[1] = maxBox[4]; prevY[1] = maxBox[5];
        
        
        /* Calculate fps and average fps */
        printf("fps: %3.1f, ", (double)1/(((double)clock() - start) / CLOCKS_PER_SEC));
        totalTime = totalTime + (double)1/(((double)clock() - start) / CLOCKS_PER_SEC);
        totalFrames++;
        printf(" average fps %3.1f", totalTime/totalFrames);
        
        /* Check for key presses */
        key = cvWaitKey( 50 );
        
        /* Enable debugging mode */
        if( key == 'd' ) {
          debug = 1;
          printf("\n*********\n\nDebug: ON\n\n*********\n");
        }
        
        /* Enable debugging mode */
        if( key == 'p' ) {
          if( stateDraw )
            stateDraw = 0;
          else
            stateDraw = 1;
          printf("\n*********\n\nParticle Drawing Toggled\n\n*********\n");
        }

    }
  
  printf("\n\nquitting");

//cvReleaseVideoWriter( &writerTracker );
cvReleaseImage( &img );
cvReleaseImage( &frame );
cvDestroyWindow( "Tracker" );
cvDestroyWindow( "Heat" );
cvDestroyWindow( "Stereo" );
cvDestroyWindow( "Position" );

return(0);

}