2012-04-07 5 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}; 
    .. 
} 

알려 주시면 알려주세요.