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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM