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 }