2012-04-07 5 views
1

hey j'ai essayé de faire un histogramme qui montre la soustraction de frames, le code est en cours d'exécution mais j'ai eu une fenêtre grise sans résultat. le message sur la fenêtre de commande est: Le compilateur n'a pas aligné les variables de pile. Libavcodec a été mal codé et peut être très lent ou accidenté. Ce n'est pas un bogue dans libavcodec, mais dans le compilateur. Vous pouvez essayer de recompiler en utilisant gcc> = 4.2. Ne signalez pas les plantages aux développeurs FFmpeg. Erreur OpenCV: Échec de l'assertion (images [j] .channels() == 1) en fonction inconnue, fichier ........ \ ocv \ opencv \ src \ cv \ cvhistogram.cpp, ligne 137histogramme sur opencv

est ici le code que quelqu'un a une idée? merci pour l'aide .....

int main() 
{ 


    int key = 0; 




    CvCapture* capture = cvCaptureFromAVI("macroblock.mpg"); 
    IplImage* frame = cvQueryFrame(capture); 
    IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3); 
    IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3); 
    IplImage* imgHistogram = 0; 
     CvHistogram* hist; 



     if (!capture) 

    { 
     fprintf(stderr, "Cannot open AVI!\n"); 
     return 1; 
     } 

     int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 

     cvNamedWindow("dest", CV_WINDOW_AUTOSIZE); 
     cvNamedWindow("imgHistogram", CV_WINDOW_AUTOSIZE); 

     while(key != 'x') 
      { 
       frame = cvQueryFrame(capture); 
     currframe = cvCloneImage(frame); 
     frame = cvQueryFrame(capture); 



       cvSub(frame,currframe,destframe); 

       int bins = 256; 
      int hsize[] = {bins}; 
      float max_value = 0, min_value = 0; 
      float value; 
      int normalized; 
      float xranges[] = {0, 256}; 
      float* ranges[] = {xranges}; 
      IplImage* planes[] = {destframe}; 

    hist = cvCreateHist(1, hsize, CV_HIST_ARRAY, ranges,1); 
    cvCalcHist(planes, hist, 0, NULL); 
    cvGetMinMaxHistValue(hist, &min_value, &max_value); 
    // printf("Minimum Histogram Value: %f, Maximum Histogram Value: %f\n", min_value, max_value); 
    imgHistogram = cvCreateImage(cvSize(bins, 50),IPL_DEPTH_8U,3); 
    cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50), CV_RGB(255,255,255),-1); 

     for(int i=0; i < bins; i++){ 
     value = cvQueryHistValue_1D(hist, i); 
     normalized = cvRound(value*50/max_value); 
     cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-normalized), CV_RGB(0,0,0)); 

     } 



       if(key==27)break; 
       cvShowImage("dest",destframe); 
       cvShowImage("imgHistogram",imgHistogram); 

       key = cvWaitKey(1000/10); 
       } 
      cvDestroyWindow("dest"); 
      cvReleaseCapture(&capture); 
      return 0; 
} 

Répondre

4

Puisque vous essayez de montrer un histogramme 1D, le plan de l'histogramme doit être en niveaux de gris. Ainsi, vous devez d'abord convertir l'image résultante de cvSub() en échelle de gris. Essayez

IplImage *gray = NULL; 
gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 

while(key != 'x') { 
    ... 
    cvSub(frame, currframe, destframe); 
    cvCvtColor(destframe, gray, CV_BGR2GRAY); 
    ... 
    IplImage* planes[] = {gray}; 
    .. 
} 

Faites-moi savoir si cela fonctionne pour vous.