利用opencv给视频截图

视频截图,仅仅实现了给AVI格式的视频截取图像,以后可以扩展。这里面视频和图像输出均与代码在同一个文件夹下。如果要输出到其他文件夹下,需要手动改变路径。


#include "highgui.h"


#include <iostream>
#include <windows.h>


using namespace std;
using namespace cv;


int main()
{
	CvCapture *capture;	//视频捕获结构变量的定义
	capture=cvCaptureFromAVI("leslie_Red_DVD.avi");	//获取视频
	int count=cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT );// 视频文件中帧的总数
	long t=1;	//时间
	int num=200;	//定义截取的图像数目,此处为200张,可自由定义
	int kNum=count/num;	//定义帧位置
	stringstream s;	//定义输出图像名称缓冲区
	IplImage* imgOut;	//输出图像变量


	while(kNum<count)
	{
		cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, kNum);	//定义帧位置
		IplImage *img=cvQueryFrame(capture);	//从视频中获取一帧
		imgOut=cvCreateImage(cvGetSize(img),img->depth,img->nChannels);	//初始化输出
		cvCopy(img,imgOut,NULL);	//复制图像


		char time[20];
		SYSTEMTIME sys = {0};
		GetLocalTime(&sys);
		sprintf(time, "%4d%02d%02d%02d%02d%02d%03d星期%1d",
			sys.wYear,
			sys.wMonth,
			sys.wDay,
			sys.wHour,
			sys.wMinute, 
			sys.wSecond,
			sys.wMilliseconds,
			sys.wDayOfWeek); 


		//t=(long)cvGetTickCount();
		s<<"result"<<time<<".jpg";
		
		//char* image_name;
		//sprintf(image_name, "%s%d%s", "image", t, ".jpg");//保存的图片名
		//cvSaveImage(image_name, img);   //保存一帧图片


		cvSaveImage(s.str().c_str(),imgOut);	//保存
		cvWaitKey(5);	//等待


		s.str("");	//清空图像名称缓冲区
		cvReleaseImage(&imgOut);	//释放图像内存
		kNum+=count/num;	//帧递增
	}
	cvReleaseCapture(&capture);	//释放视频获取结构变量的内存
}


1、关于cvGetCaptureProperty函数

该函数利用property_id属性来获取视频或者摄像头的一定属性值;函数原型为:

double cvGetCaptureProperty( CvCapture* capture, int property_id );
property_id的值主要利用到一下几个:

CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度
CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度
CV_CAP_PROP_FPS - 帧率
CV_CAP_PROP_FOURCC - 表示codec的四个字符
CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数

2、关于cvSetCaptureProperty函数
设置视频或者摄像头获取结构的属性。函数原型如下:
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
capture为获取结构,property_id为属性(详见cvGetCaptureProperty函数),value为要设置的值。
3、这里有一个视频播放的代码,实现了滚动条控制播放进程。链接如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值