2012-04-02 6 views
1

Ich mache ein Projekt für Videoüberwachung.
Ich kann die Umwandlung von RGB zu Grau nicht sehen; Ich bekomme ein schwarzes Fenster für das Grau.
Könnten Sie mir bitte bei dem Problem helfen? (Code im Anhang)
Wie kann ich den Unterschied zwischen dem aktuellen Frame und dem vorherigen Frame ermitteln?
Vielen Dank. IlanOpenCV RGB zu Grau

#include "stdafx.h" 
#include <stdio.h> // For printf 
#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h>  

int main() 
{ 


    int key = 0; 



    CvCapture* capture = cvCaptureFromAVI("macroblock.mpg"); 
    IplImage* frame = cvQueryFrame(capture); 
    IplImage* gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1); 
    cvCvtColor(frame, gray, CV_RGB2GRAY); 

     if (!capture) 

    { 
     fprintf(stderr, "Cannot open AVI!\n"); 
     return 1; 
     } 
      int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 

      cvNamedWindow("video", CV_WINDOW_AUTOSIZE); 
     cvNamedWindow("grayvideo", CV_WINDOW_AUTOSIZE); 

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




    if(key==27)break; 
    cvShowImage("video",frame); 
    cvShowImage("grayvideo",gray); 


      key = cvWaitKey(1000/fps); 
    } 
      cvDestroyWindow("video"); 
    cvReleaseCapture(&capture); 

    return 0; 
} 
+0

Sie sollten die C++ opencv api lernen. Wenn Sie das cv :: Mat-Objekt für Bilder verwenden, die einen eigenen Destruktor (und einen Ref-Zähler) haben, müssen Sie das IplImage * nicht manuell freigeben, was Sie in Ihrem Code vergessen haben. – Eric

+0

Wenn diese Frage erfolgreich beantwortet wurde, sollten Sie die offizielle Antwort auswählen, indem Sie auf das Kontrollkästchen daneben klicken. Wenn nicht, sollten Sie Ihre eigene Antwort hinzufügen. – karlphillip

Antwort

3

Sie müssen jeden Rahmen von Farbe konvertieren in Graustufen. Es wird nicht automatisch konvertiert, wenn Sie es einmal am Anfang tun. Sie müssen also

cvCvtColor(frame, gray, CV_BGR2GRAY); 

in die While-Schleife nach dem Aufruf von cvQueryFrame hinzuzufügen.

+0

danke seine Arbeit :) –

+0

kann ich den Unterschied zwischen dem aktuellen Frame zu vorherigen Frame in diesem Code? Wie reduziere ich den vorherigen vom aktuellen Frame und zeige das Ergebnis im Fenster an? –

+0

Ich bin mir ziemlich sicher, dass BGR das Standard-Pixel-Format in OpenCV ist. Ich sehe, dass die meisten Beispiele CV_RGB2GRAY verwenden, aber imho (es sei denn, ich bin sehr falsch), wäre es besser, CV_BGR2GRAY zu verwenden –

1

Es gab ein paar Probleme mit Ihrem Code.

  • Es war ein Durcheinander und schlecht idented;
  • Wenn Sie die Rückgabe einer Funktion überprüfen müssen, sollten Sie dies sofort nach dem Aufruf tun. Bsp .: cvCaptureFromAVI();
  • Da cvQueryFrame() möglicherweise fehlschlagen, müssen Sie überprüfen, ob es auch zurückgegeben wird;
  • Sie haben vergessen, die RGB -> GRAU-Konvertierung: cvCvtColor(frame, gray, CV_RGB2GRAY); vor dem Anzeigen des grauen Rahmens auszuführen;
  • Sie haben auch vergessen, die Ressourcen für die greyvideo Fenster freigeben;

Ist es nicht einfacher, einen Code zu lesen/zu verstehen, wenn er so aussieht?

int main() 
{  
    CvCapture* capture = cvCaptureFromAVI("macroblock.mpg"); 
    if (!capture) 
    { 
     fprintf(stderr, "Cannot open AVI!\n"); 
     return 1; 
    } 

    int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
    printf("FPS: %d\n", fps); 

    cvNamedWindow("video", CV_WINDOW_AUTOSIZE); 
    cvNamedWindow("grayvideo", CV_WINDOW_AUTOSIZE); 

    int key = 0; 
    IplImage* gray = NULL; 
    IplImage* prev_frame = NULL; 

    while(key != 'x') 
    { 
     frame = cvQueryFrame(capture); 
     if (!frame) 
     { 
      // print error and abort the loop 
      break; 
     } 

     cvShowImage("video", frame); 

     if (!gray) // allocate space for the GRAY frame only once 
     { 
      gray = cvCreateImage(cvGetSize(frame), frame->depth,1); 
     } 
     cvCvtColor(frame, gray, CV_RGB2GRAY); // convert RGB frame to GRAY 
     cvShowImage("grayvideo", gray); 

     if (!prev_frame) // allocate space for the GRAY frame only once 
     { 
      prev_frame = cvCreateImage(cvGetSize(frame), frame->depth,1); 
      cvCopy(frame, prev_frame, 0); 
     } 

     // perform process to compute the "difference" of the current 
     // and previous frames: 
     // <add your code here> 

     // then, update prev_frame now so in the next iteration it holds the previous frame 
     cvCopy(frame, prev_frame, 0); 

     key = cvWaitKey(1000/fps); 
     if (key==27) // ESC was pressed 
      break; 
    } 

    cvDestroyWindow("video"); 
    cvDestroyWindow("grayvideo"); 

    cvReleaseCapture(&capture); 

    if (gray) 
     cvReleaseImage(&gray); 

    if (prev_frame) 
     cvReleaseImage(&prev_frame); 

    return 0; 
} 
+0

ja, aber dieser Code läuft nicht –

+0

haben Sie eine Idee, wie Sie den Unterschied zwischen 2 Frames zum Beispiel aktuellen Frame zu vorherigen Frame tun? danke –

+0

Ich habe gerade den Code aktualisiert, um den vorherigen Frame zu speichern. Die Berechnung der * Differenz zwischen 2 Frames *, was auch immer das für Sie bedeutet, muss geschrieben werden. Es gibt eine Reihe von Fragen darüber, wie man den Unterschied zwischen Frames in diesem Forum erkennen kann. Sie können das Suchfeld verwenden, um Ihnen zu helfen und die geeignete Technik zu finden. Viel Glück. – karlphillip

0

Verwendung eines von unten opencv auf Sie basierten Funktionen benötigen:

subtract(img_current,img_prev, img_diff); 
absdiff(img_current, img_prev, img_diff); 
+1

Hallo Dawit, kannst du mehr Details oder eine Erklärung deines Codes liefern? – furins