【轉】OpenCV的C++版本播放視頻的綜合例子


  1 #include <opencv2/core/core.hpp>
  2 #include <opencv2/highgui/highgui.hpp>
  3 #include <opencv2/imgproc/imgproc.hpp>
  4 #include <iostream>
  5 
  6 using namespace std;
  7 using namespace cv;
  8 
  9 int main()
 10 {
 11     //打開視頻文件:其實就是建立一個VideoCapture結構
 12     VideoCapture capture("D:/videos/PetsD2TeC2.avi");
 13     //檢測是否正常打開:成功打開時,isOpened返回ture
 14     if(!capture.isOpened())
 15         cout<<"fail to open!"<<endl;
 16     //獲取整個幀數
 17     long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
 18     cout<<"整個視頻共"<<totalFrameNumber<<""<<endl;
 19 
 20 
 21     //設置開始幀()
 22     long frameToStart = 300;
 23     capture.set( CV_CAP_PROP_POS_FRAMES,frameToStart);
 24     cout<<"從第"<<frameToStart<<"幀開始讀"<<endl;
 25 
 26 
 27     //設置結束幀
 28     int frameToStop = 400;
 29 
 30     if(frameToStop < frameToStart)
 31     {
 32         cout<<"結束幀小於開始幀,程序錯誤,即將退出!"<<endl;
 33         return -1;
 34     }
 35     else
 36     {
 37         cout<<"結束幀為:第"<<frameToStop<<""<<endl;
 38     }
 39 
 40 
 41     //獲取幀率
 42     double rate = capture.get(CV_CAP_PROP_FPS);
 43     cout<<"幀率為:"<<rate<<endl;
 44 
 45 
 46 
 47     //定義一個用來控制讀取視頻循環結束的變量
 48     bool stop = false;
 49     //承載每一幀的圖像
 50     Mat frame;
 51     //顯示每一幀的窗口
 52     namedWindow("Extracted frame");
 53     //兩幀間的間隔時間:
 54     //int delay = 1000/rate;
 55     int delay = 1000/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         
 76         //這里加濾波程序
 77         imshow("Extracted frame",frame);
 78         filter2D(frame,frame,-1,kernel);
 79 
 80         imshow("after filter",frame);
 81         cout<<"正在讀取第"<<currentFrame<<""<<endl;
 82         //waitKey(int delay=0)當delay ≤ 0時會永遠等待;當delay>0時會等待delay毫秒
 83         //當時間結束前沒有按鍵按下時,返回值為-1;否則返回按鍵
 84 
 85 
 86         int c = waitKey(delay);
 87         //按下ESC或者到達指定的結束幀后退出讀取視頻
 88         if((char) c == 27 || currentFrame > frameToStop)
 89         {
 90             stop = true;
 91         }
 92         //按下按鍵后會停留在當前幀,等待下一次按鍵
 93         if( c >= 0)
 94         {
 95             waitKey(0);
 96         }
 97         currentFrame++;
 98     
 99     }
100     //關閉視頻文件
101     capture.release();
102     waitKey(0);
103     return 0;
104 }

 


免責聲明!

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



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