2012-03-28 11 views
5

Problem jest następujący Chcę odczytać plik wideo z dysku i przekształcenia jej każdą klatkę w odcieniach szarości i zapisać go do nowego pliku wideo Używam następujący kod do zrobienia więcOpenCV cvWriteFrame, cvWriteToAVI

CvCapture* capture = cvCreateFileCapture("/root/tree.avi"); 
if (!capture){ 
    return -1; 
} 
... 
CvVideoWriter* writer = 
cvCreateVideoWriter("/root/output.avi",CV_FOURCC('D','I','V','X'),fps,size); 
    ... 
    IplImage* gray_frame = cvCreateImage(
    size, 
    IPL_DEPTH_8U, 
    1 
); 

    while((bgr_frame=cvQueryFrame(capture)) != NULL) { 
    cvShowImage("Example2_10", bgr_frame); 

    cvCvtColor(bgr_frame,gray_frame,CV_RGB2GRAY); 

    cvShowImage("B&W result", gray_frame); 
    cvWriteFrame(writer, gray_frame); 
    char c = cvWaitKey(10); 
    if(c == 27) break; 
} 
... 

problem polega na tym, program działa poprawnie, ale nie napisać ramek do output.avi i creats tylko pusty plik output.avi sprawiedliwego 5.5KB

jeszcze jedna rzecz jest nie jestem w stanie napisać tylko gra_frame użyciu cvWriteFrame i jeśli próbuję zapisać bgr_frame, to z powodzeniem wypisze plik output.avi.

Proszę, jeśli ktoś zna rozwiązanie, daj mi znać

Odpowiedz

3

Trzeba zdać is_color=0 do funkcji cvCreateVideoWriter jeśli chcesz napisać obrazów wartość szarości. Z tego powodu można tylko pisać kolorowe obrazy do wyjściowego wideo.

Jest to ostatni parametr funkcji cvCreateVideoWriter które domyślnie 1:

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1) 
+0

Rzeczywiście. Zauważ, że tej funkcji wciąż może brakować w Linuksie. tj. wideo będzie w trybie kolorowym niezależnie od tego parametru. To był błąd, który napotkałem jakiś czas temu, nie jestem pewien, czy jest on już naprawiony. – TaZ

+0

Mogę potwierdzić, że działa to w Linuksie, po prostu sam go użyłem. – RyanfaeScotland

0

W moim przypadku problemem było to, że stworzył się CvVideoWriter w innej rozdzielczości niż obraz pisałem do niego za pomocą cvWriteFrame . To działało dobrze we wcześniejszej wersji OpenCV, ale nie udało się zapisać ramek w OpenCV 2.4