way - Escribir archivos AVI en OpenCV
opencv with python pdf (7)
Tal vez podrías intentar insertar un printf ("Frame found / n") dentro de for (;;) para ver si realmente está capturando fotogramas. O mejor:
if(colourImage == NULL) {
printf("Warning - got NULL colourImage/n");
continue;
}
cvNamedWindow( "test", 1);
cvShowImage( "test", colourImage );
cvWaitKey( 0 );
cvDestroyWindow( "test" );
Luego vea si tiene ventanas y si contienen los contenidos correctos.
Hay un ejemplo en la red y el código dado en Learn OpenCv, Orielly.
Después de muchos intentos, el archivo out.avi se escribe con 0 bytes. Me pregunto dónde me equivoqué.
Los siguientes son el código que utilicé ...
int main(int argc, char* argv[]) {
CvCapture* input = cvCaptureFromFile(argv[1]);
IplImage* image = cvRetrieveFrame(input);
if (!image) {
printf("Unable to read input");
return 0;
}
CvSize imgSize;
imgSize.width = image->width;
imgSize.height = image->height;
double fps = cvGetCaptureProperty(
input,
CV_CAP_PROP_FPS
);
CvVideoWriter *writer = cvCreateVideoWriter(
"out.avi",
CV_FOURCC(''M'', ''J'', ''P'', ''G''),
fps,
imgSize
);
IplImage* colourImage;
//Keep processing frames...
for (;;) {
//Get a frame from the input video.
colourImage = cvQueryFrame(input);
cvWriteFrame(writer, colourImage);
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture(&input);
}
Mi apuesta es que cvCreateVideoWriter devuelve NULL. Solo páselo para ver si es verdad. En ese caso, el problema probablemente sea con CV_FOURCC (..) que no encuentre el códec y fuerce un retorno 0;
puedes intentar usar -1 en lugar de CV_FOURCC. Habrá un aviso durante el tiempo de ejecución para que elijas el códec apropiado
Cuando busqué en Google este problema, me encontré con una respuesta: "OpenCV en mac os x no admite avi write hasta que se compile con un ffmpeg"
En mi opinión, parece que se aplica esta solución http://article.gmane.org/gmane.comp.lib.opencv/16005
Debe proporcionar la ruta completa al archivo con la película en cvCreateVideoWriter. No sé si solo se trata de un problema de puerto Mac OS X, pero podría ser así, ya que se utiliza QTNewDataReferenceFromFullPathCFString desde el backend QT.
hey Este código funciona en DevC ++ pruébalo:
#include<cv.h>
#include<highgui.h>
#include<cvaux.h>
#include<cvcam.h>
#include<cxcore.h>
int main()
{
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 5; // or 30
int frameW = 1600; //640; // 744 for firewire cameras
int frameH = 1200; //480; // 480 for firewire cameras
//writer=cvCreateVideoWriter("out.avi",CV_FOURCC(''P'',''I'',''M'',''1''),
// fps,cvSize(frameW,frameH),isColor);
writer=cvCreateVideoWriter("out.avi",-1,
fps,cvSize(frameW,frameH),isColor);
IplImage* img = 0;
img=cvLoadImage("CapturedFrame_0.jpg");
cvWriteFrame(writer,img); // add the frame to the file
img=cvLoadImage("CapturedFrame_1.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_2.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_3.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_4.jpg");
cvWriteFrame(writer,img);
img=cvLoadImage("CapturedFrame_5.jpg");
cvWriteFrame(writer,img);
cvReleaseVideoWriter(&writer);
return 0;
}
Lo compilé y lo ejecuté, funciona bien. (No vi arriba si obtuviste tu respuesta o no ... pero por esta cosa en particular trabajé muy duro antes y de repente acabo de hacerlo, a partir de algunos fragmentos de código).
Este código funcionó bien:
cv.h
highgui.h
cvaux.h
cvcam.h
cxcore.h
int main(){
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 5; // or 30
IplImage* img = 0;
img=cvLoadImage("animTest_1.bmp");
int frameW = img->width; //640; // 744 for firewire cameras
int frameH = img->height; //480; // 480 for firewire cameras
writer=cvCreateVideoWriter("out.avi",-1,
fps,cvSize(frameW,frameH),1);
cvWriteFrame(writer, img); // add the frame to the file
char *FirstFile,fF[20]="",*fileNoStr,fns[4]="";
fileNoStr=fns;
for(int fileNo;fileNo<100;fileNo++){
FirstFile=fF;
itoa(fileNo,fileNoStr,10);
FirstFile=strcat ( FirstFile,"animTest_");
FirstFile=strcat ( FirstFile,fileNoStr);
FirstFile=strcat ( FirstFile,".bmp");
printf(" /n%s .",FirstFile);
img=cvLoadImage(FirstFile);
cvWriteFrame(writer, img);
}
cvReleaseVideoWriter(&writer);
return 0;
}
Creo que el problema con el que te encuentras es que tu ciclo "para" nunca termina; por lo tanto, cvReleaseVideoWriter(&writer);
y cvReleaseCapture(&input);
nunca ser llamado. Pruebe algo como for(int i=0; i<200; i++)
ejemplo for(int i=0; i<200; i++)
y vea si termina con un video en funcionamiento.
A menudo, el video se escribe en un archivo temporal antes de finalizarlo en el disco. Si su archivo no está finalizado, no habrá nada que ver.
Espero que ayude.
Es un problema de codec. Pruebe todos los códecs posibles (opción -1
en cvCreateVideo
). En mi caso, Microsoft Video 1
funcionó bien.