opencv从摄像头读视频文件,并且写入到本地目录
代码如下:
#include "cv.h"
#include "highgui.h"
int main()
{
CvCapture *capture = cvCaptureFromCAM(0); //使用摄像头
//如果没有摄像头,则直接跳出
if (!capture)
{
cout<<"can not find a camera"<<endl;
return;
}
IplImage *frame = cvQueryFrame(capture); //先捕获一帧
CvVideoWriter *videoWriter = 0; //写视频结构体
int fps = 25; //捕捉帧率 ,影响生产的文件的播放速度
int isColol=1;
videoWriter = cvCreateVideoWriter("D:\\out.avi",
CV_FOURCC('X', 'V', 'I', 'D'),//-1, //CV_FOURCC('F', 'L', 'V', '1'),
fps,
cvSize(frame->width, frame->height), isColol);
while(frame)
{
cvWriteFrame(videoWriter, frame);
cvShowImage( "video from camera", frame ); //显示一帧图像
if (cvWaitKey(1000 / fps) == 27)
{
break; //跳出循环
}
frame = cvQueryFrame(capture);
}
cvReleaseVideoWriter(&videoWriter);//一定需要释放
//cvReleaseImage(&frame);
cvReleaseCapture(&capture);
cvDestroyWindow("video from camera");
return 0;
}
其中写视频时需要下载xvid编解码器,自己到网上down一下就行了,直接安装就好。
可能会出现的问题:
1.opencv中申请一块内存
IplImage *frame = cvQueryFrame(capture); //先捕获一帧
在程序执行完前需要释放内存,即调用
cvReleaseImage(&frame);
以前为了省事,我也经常不释放,感觉也没有出现什么事情。其实那是因为调用 “cvReleaseImage(&frame);”时opencv中只释放了内存而没有去做其余的事情,而不调用的话该语句,系统在程序执行完成后也会把该应用占用的内存释放掉。
但是在创建一个写视频文件时
CvVideoWriter *videoWriter = 0; //写视频结构体时
读取视频完毕后一定要释放掉,即调用
cvReleaseVideoWriter(&videoWriter);
因为在调用”cvReleaseVideoWriter(&videoWriter);”时,opencv还做了其余的事情,比如将视频的一些参数封装进视频,以前写代码时总不释放VideoWriter,导致用播放器播放视频时不能快进,我估计是播放器不知道视频的总帧数,当然也就不知道视频的总时长了。
2.释放CvCapture 与IplImage时:
cvQueryFrame与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。这样的话,就没有必要通过cvReleaseImage()对这个返回的图像指针进行释放,当CvCapture结构被释放后,每一帧图像所对应的内存空间即会被释放。
//cvReleaseImage(&frame);
cvReleaseCapture(&capture);
不然后出现如下图所示的错误:
PS:关于OpenCV中可能出现的一些内存问题,http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7586847中已经有描述,大家可以参考。