2012-04-07 9 views
1

ちょっと、私はフレームの減算を示すヒストグラムを作ろうとしましたが、コードは実行されていますが、結果のないグレーのウィンドウがあります。 コマンドウィンドウのメッセージは次のとおりです。 コンパイラがスタック変数を揃えませんでした。 Libavcodecは にコンパイルされており、非常に遅いかクラッシュする可能性があります。これはlibavcodecのバグではなく、 ですが、コンパイラにあります。 gcc> = 4.2を使って再コンパイルしてみてください。 FFmpeg開発者にクラッシュを報告しないでください。 OpenCVエラー:アサーションに失敗しました(画像[j] .channels()== 1)不明な関数、 ファイル........ \ ocv \ opencv \ src \ cv \ cvhistogram.cpp、行137ヒストグラムon 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

あなたは1次元ヒストグラムを表示しようとしているので、ヒストグラム面はグレースケールにする必要があります。したがって、最初に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}; 
    .. 
} 

あなたに適しているかどうか教えてください。

関連する問題