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 }