C++读取视频帧保存成图片

  1 #include<opencv2\opencv.hpp>
  2 #include <iostream>
  3 #include <stdio.h>
  4 #include<fstream> 
  5 
  6 using namespace std;
  7 using namespace cv;
  8 
  9 
 10 
 11 int main()
 12 {
 13     //打开视频文件:其实就是建立一个VideoCapture结构  
 14     VideoCapture capture("D:/MyData/zhaohz4/Desktop/Nansha_video/2.mp4");   
 15     //检测是否正常打开:成功打开时,isOpened返回ture  
 16     if (!capture.isOpened())
 17         cout << "fail toopen!" << endl;
 18 
 19     //获取整个帧数  
 20     long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
 21     cout << "整个视频共" << totalFrameNumber << "帧" << endl;
 22     //设置开始帧()  
 23     long frameToStart = 1;
 24     capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);
 25     cout << "从第" << frameToStart << "帧开始读" << endl;
 26 
 27 
 28     //设置结束帧  
 29     int frameToStop = 4000;
 30 
 31     if (frameToStop < frameToStart)
 32     {
 33         cout << "结束帧小于开始帧,程序错误,即将退出!" << endl;
 34         return -1;
 35     }
 36     else
 37     {
 38         cout << "结束帧为:第" << frameToStop << "帧" << endl;
 39     }
 40 
 41     //获取帧率  
 42     double rate = capture.get(CV_CAP_PROP_FPS);
 43     cout << "帧率为:" << rate << endl;
 44     //定义一个用来控制读取视频循环结束的变量  
 45     bool stop = false;
 46 
 47     //承载每一帧的图像  
 48     Mat frame;
 49 
 50     //显示每一帧的窗口  
 51     namedWindow("Extractedframe");
 52 
 53     //两帧间的间隔时间:  
 54     //int delay = 1000/rate;  
 55     double delay = 2000 / rate;     //??
 56 
 57 
 58     //利用while循环读取帧  
 59     //currentFrame是在循环体中控制读取到指定的帧后循环结束的变量  
 60     long currentFrame = frameToStart;
 61 
 62 
 63     //滤波器的核  
 64     int kernel_size = 3;
 65     Mat kernel = Mat::ones(kernel_size, kernel_size, CV_32F) / (float)(kernel_size*kernel_size);
 66 
 67     while (!stop)
 68     {
 69         //读取下一帧  
 70         if (!capture.read(frame))
 71         {
 72             cout << "读取视频失败" << endl;
 73             return -1;
 74         }
 75         if (currentFrame % 3 == 0)    //每三帧保存一帧
 76         {
 77             cout << "正在读取第" << currentFrame << "帧" << endl;
 78             imshow("Extractedframe", frame);
 79 
 80             cout << "正在写第" << currentFrame << "帧" << endl;
 81             stringstream str;
 82             str << "2-"<<currentFrame << ".jpg";     //保存格式
 83             cout << str.str() << endl;
 84             imwrite(str.str(), frame);
 85         }
 86 
 87         //waitKey(intdelay=0)当delay≤ 0时会永远等待;当delay>0时会等待delay毫秒  
 88         //当时间结束前没有按键按下时,返回值为-1;否则返回按键  
 89         //int c = waitKey(delay);
 90         int c = waitKey(1000);
 91         //按下ESC或者到达指定的结束帧后退出读取视频  
 92         if ((char)c == 27 || currentFrame > frameToStop)
 93         {
 94             stop = true;
 95         }
 96         //按下按键后会停留在当前帧,等待下一次按键  
 97         if (c >= 0)
 98         {
 99             waitKey(0);
100         }
101         currentFrame++;
102 
103     }
104     //关闭视频文件  
105     capture.release();
106     waitKey(0);
107     return 0;
108 }