视频截图,仅仅实现了给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、这里有一个视频播放的代码,实现了滚动条控制播放进程。链接如下: