您的位置:首页 > 运维架构

使用openCv从avi视频提取照片图片

2012-12-10 12:22 656 查看
使用openCv提取avi里的视频(不限制avi格式,只要opencv支持的格式都行,同样来源也可以是摄像头),每隔几帧保存一张。

1.使用cvGrabFrame()+cvRetrieveFrame()

int main()
{
CvCapture *capture = NULL;
IplImage *frame = NULL;
char *AviFileName = "E:\\video.avi";//视频的目录
char *AviSavePath = "E:\\截图\\";//图片保存的位置
const int jiange = 2;//间隔两帧保存一次图片
capture = cvCaptureFromAVI(AviFileName);
cvNamedWindow("AVI player",1);
int count_tmp = 0;//计数总帧数
char tmpfile[100]={'\0'};
while(true)
{
if(cvGrabFrame(capture))
{
if (count_tmp % jiange == 0)
{
frame=cvRetrieveFrame(capture);
cvShowImage("AVI player",frame);//显示当前帧
sprintf(tmpfile,"%s//%d.jpg",AviSavePath,count_tmp);//使用帧号作为图片名
cvSaveImage(tmpfile,frame);
}
if(cvWaitKey(10)>=0) //延时
break;
++count_tmp;
}
else
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("AVI player");
cout<<"总帧数"<<count_tmp<<endl;
return 0;
}


2.使用cvQueryFrame()

int main()
{
CvCapture *capture = NULL;
IplImage *frame = NULL;
char *AviFileName = "E:\\video.avi";
char *AviSavePath = "E:\\截图\\";
const int jiange = 2;//间隔两帧保存一次图片
capture = cvCaptureFromAVI(AviFileName);
cvNamedWindow("AVI player",1);
int count_tmp = 0;//计数 总帧数
char tmpfile[100]={'\0'};
while( (frame=cvQueryFrame(capture)) != NULL)
{
if (count_tmp % jiange == 0)
{
cvShowImage("AVI player",frame);//显示当前帧
sprintf(tmpfile,"%s//%d.jpg",AviSavePath,count_tmp);//使用帧号作为图片名
cvSaveImage(tmpfile,frame);
}
if(cvWaitKey(10)>=0) //延时
break;
++count_tmp;
}
cvReleaseCapture(&capture);
cvDestroyWindow("AVI player");
cout<<"总帧数"<<count_tmp<<endl;
return 0;
}

参考资料:

OpenCV 获取摄像头,新建窗口显示摄像头视频

http://www.cnblogs.com/Anykong/archive/2011/04/09/Anykong_OpenCV2.html

AVI文件的读取并显示

http://blog.csdn.net/lelekyle/article/details/5679135

ps:本人在opencv 2.4.1 + vs2010,编译上述代码通过,但运行出错(同事的就不出错),环境配置是没问题的,估计是库的问题。

而使用opencv 2.4.1+ vc6.0完全正常。不知是神马问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: