现在的位置: 首页 > 综合 > 正文

OpenCV从AVI视频提取图片

2013年04月16日 ⁄ 综合 ⁄ 共 2279字 ⁄ 字号 评论关闭

使用OpenCV提取AVI里的视频(不限制avi格式,只要opencv支持的格式都行,同样来源也可以是摄像头),每隔几帧保存一张。

1.使用cvGrabFrame()+cvRetrieveFrame()

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#pragma comment(lib, "ml.lib")
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cvaux.lib")
#pragma comment(lib, "cvcam.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "cxts.lib")
#pragma comment(lib, "highgui.lib")
#pragma comment(lib, "cvhaartraining.lib")

int main()
{
	CvCapture *capture = NULL;
	IplImage *frame = NULL;
	char *AviFileName = "D:\\clock.avi";//视频的目录
	char *AviSavePath = "D:\\截图\\";//图片保存的位置
	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"); 
	std::cout<<"总帧数" << count_tmp << std::endl;
	return 0;
}

2.使用cvQueryFrame()

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#pragma comment(lib, "ml.lib")
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cvaux.lib")
#pragma comment(lib, "cvcam.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "cxts.lib")
#pragma comment(lib, "highgui.lib")
#pragma comment(lib, "cvhaartraining.lib")

int main()
{
	CvCapture *capture = NULL;
	IplImage *frame = NULL;
	char *AviFileName = "D:\\clock.avi";
	char *AviSavePath = "D:\\截图2\\";
	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"); 
	std::cout << "总帧数" << count_tmp << std::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完全正常。不知是神马问题。

抱歉!评论已关闭.