2012-03-28 8 views
5

El problema es el siguiente quiero leer un archivo de vídeo desde el disco y convertir su cada cuadro en escala de grises y escribirlo en nuevo archivo de vídeo estoy usando siguiente código para hacerloOpenCV 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; 
} 
... 

El problema es que el programa funciona muy bien, pero no puede escribir tramas para output.avi y creats archivo output.avi solamente en blanco de tan sólo 5,5 KB

Una cosa más es que soy incapaz de escribir solamente gra_frame usando cvWriteFrame, y si intento escribir bgr_frame, escribe el archivo output.avi con éxito.

Por favor si alguien sabe la solución, que me haga saber

Respuesta

3

Es necesario pasar a la función is_color=0cvCreateVideoWriter si quiere escribir imágenes de valor de gris. Por eso, solo puede escribir imágenes en color en su video de salida.

ya es el último parámetro de la función cvCreateVideoWriter que por defecto es 1:

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

De hecho. Tenga en cuenta que esta funcionalidad aún puede faltar en Linux. es decir, el video estará en modo de color independientemente de ese parámetro. Ese fue un error que encontré hace un tiempo, no estoy seguro si ya está arreglado. – TaZ

+0

Puedo confirmar que esto funciona en Linux, solo lo uso ahora. – RyanfaeScotland

0

En mi caso, el problema es que he creado un un CvVideoWriter en una resolución diferente a la imagen que escribí a él utilizando cvWriteFrame . Esto funcionó bien en una versión anterior de OpenCV, pero no pudo escribir marcos en OpenCV 2.4