I am trying to create an avi video from my webcam output using opencv. No exceptions are thrown, however the avi file it creates is 414 bytes in size and does not grow.
Also it will not play with any media player. I suspect there is something wrong with the writing to file part.
Here is the code:
CvCapture *capture = cvCaptureFromCAM( 0 );
int width = ( int )cvGetCaptureProperty( capture,
CV_CAP_PROP_FRAME_WIDTH );
int height = ( int )cvGetCaptureProperty( capture,
CV_CAP_PROP_FRAME_HEIGHT );
CvVideoWriter *writer = cvCreateVideoWriter("CamCapture.avi",
-1,30, cvSize( width, height ) );
cvNamedWindow("capWindow", CV_WINDOW_AUTOSIZE);
IplImage *frame = 0;
// this returns 0 not sure why ??
//double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
double fps = 30;
while( 1 )
{
frame = cvQueryFrame( capture );
cvShowImage("capWindow",frame);
cvWriteFrame( writer, frame );
char c = cvWaitKey(1000/fps);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvReleaseVideoWriter( &writer );
cvDestroyWindow( "capWindow" );
I have referenced and tried the following samples with no luck:
Dont use outdated C, use C++ api, it is easy to use and simple, for example the above code can be rewritten in C++ like,
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(){
VideoCapture vcap(0);
if(!vcap.isOpened()){
cout << "Error opening video stream or file" << endl;
return -1;
}
int frame_width= vcap.get(CV_CAP_PROP_FRAME_WIDTH);
int frame_height= vcap.get(CV_CAP_PROP_FRAME_HEIGHT);
VideoWriter video("out.avi",CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height),true);
for(;;){
Mat frame;
vcap >> frame;
video.write(frame);
imshow( "Frame", frame );
char c = (char)waitKey(33);
if( c == 27 ) break;
}
return 0;
}