运行环境:vs2015+opencv3.2
,接近类似环境都可以,vs2012以上,opencv3.0以上
#include <iostream>
//#include "cv.h"
#include "opencv2/opencv.hpp"
#include <string>
#include <iomanip>
using namespace std;
using namespace cv;
// 描述:将视频帧转成图片输出
void main()
{
// 获取视频文件
VideoCapture cap("20170524_181334_953.avi");
// 获取视频总帧数
long totalFrameNumber = cap.get(CV_CAP_PROP_FRAME_COUNT);
cout << "total frames: " << totalFrameNumber << endl;
Mat frame;
bool flags = true;
long currentFrame = 0;
while (flags) {
// 读取视频每一帧
cap.read(frame);
//这行代码将彩色图转化为灰度图
//cvtColor(frame, frame, CV_BGR2GRAY);
//这行代码将彩色图转化为单通道图,如需要取消注释,上同
//frame.convertTo(frame, CV_8UC1);
char filename[100];
sprintf(filename, "D:\\vs_project\\video2pic\\pic\\%06d.png", currentFrame);
cout << "正在处理第" << currentFrame << "帧" << endl;
printf("\n");
stringstream ss;
ss << setw(6) << setfill('0') << currentFrame << ".png";
// 设置每2帧获取一次帧
//if (currentFrame % 2 == 0) {
// 将帧转成图片输出
if (currentFrame == totalFrameNumber-1)
break;
imwrite("D:\\vs_project\\video2pic\\pic\\" + ss.str(), frame);
//}
currentFrame++;
}
system("pause");
}
想把每一帧保存上面就可以直接用,每隔几帧就把上面的if取消注释,把2改成自己想要的数字。
程序里面有几句没用的代码,无伤大雅。
很抱歉的一句话:之前程序写错,多了一个大括号。写上去的代码让人不能运行,对整个博客的生态是很不友好的。