视频截图,仅仅实现了给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的值主要利用到一下几个:
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );capture为获取结构,property_id为属性(详见cvGetCaptureProperty函数),value为要设置的值。