2012-04-07 128 views
1

嘿我試圖做一個直方圖,顯示幀減法,代碼正在運行,但我得到了沒有結果的灰色窗口。 命令窗口中的消息是: 編譯器未對齊堆棧變量。 Libavcodec已被編譯錯誤 並可能非常緩慢或崩潰。這不是libavcodec, 中的錯誤,而是編譯器中的錯誤。您可以嘗試使用gcc> = 4.2進行重新編譯。 不要向FFmpeg開發人員報告崩潰。 OpenCV Error:Assertion failed(images [j] .channels()== 1)in unknown function, file ........ \ ocv \ opencv \ src \ cv \ cvhistogram.cpp,第137行直方圖opencv

這裏是代碼的人有一個想法?感謝您的幫助.....

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; 
} 

回答

4

既然你是想顯示一維直方圖,直方圖飛機需要以灰度顯示。因此,您需要先將產生的圖像從cvSub()轉換爲灰度。嘗試

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}; 
    .. 
} 

讓我知道它是否適合你。