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 }