opencv——顯示視頻並創建滾動條(2段代碼,)

    1. //該代碼的滾動條並不隨視頻播放而前進!

  1. // CV模塊中包含了圖像處理,圖像結構分析  
  2. // 運動描述和跟蹤,模式識別和攝像機標定  
  3. #include"cv.h"  
  4.   
  5. //包含了圖像和視頻的輸入和輸出  
  6. #include"highgui.h"  
  7.   
  8. // 用來標定滾動條當前的位置  
  9.  int g_Pos = 0;  
  10.   
  11.  // 將打開的視頻文件作爲一個全局變量使用  
  12.  CvCapture* g_Capture = NULL;  
  13.   
  14.  // 當拖動滾動條後,會回調這個函數  
  15.  // 同時會將當前滾動條的位置以32位形式傳遞過來  
  16.  void CallBackTrackBarSlide(int pos)  
  17.  {  
  18.      // 這裏便是重新設置的視頻文件當前播放的幀  
  19.     cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);  
  20.  }  
  21.   
  22.  // 主函數  
  23.  int main(int argc, char** argv)  
  24.  {   
  25.      // 創建一個名爲vediox的窗口   
  26.     cvNamedWindow("vediox",CV_WINDOW_AUTOSIZE);  
  27.   
  28.      // 根據參數打開指定的視頻文件  
  29.     g_Capture = cvCreateFileCapture("vedio.avi");  
  30.   
  31.      // 獲取總的幀數  
  32.     int totalFrames =   
  33.         (int) cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);  
  34.   
  35.     if(totalFrames != 0)  
  36.     {      
  37.         // 創建滾動條,在這裏指定了滾動條拖動後的回調函數  
  38.         cvCreateTrackbar("TrackBar","vediox",&g_Pos,totalFrames,CallBackTrackBarSlide);  
  39.     }  
  40.   
  41.     IplImage* frame;  
  42.      // 循環地順序遍歷所有的幀  
  43.     while(1)  
  44.     {  
  45.         // 獲取當前幀的下一個幀,並將其加載到內存中  
  46.         frame = cvQueryFrame(g_Capture);  
  47.         if(!frame)  
  48.         {  
  49.             break;  
  50.         }  
  51.         cvShowImage("vediox",frame);  
  52.         char chKeyCode = cvWaitKey(30);  
  53.         if(chKeyCode == 27)  
  54.         {  
  55.             break;  
  56.         }  
  57.     }  
  58.   
  59.     cvReleaseCapture(&g_Capture);  
  60.     cvDestroyWindow("vediox");  
  61.   
  62.     return 0;  
  63. }

該段代碼的滾動條會隨視頻播放而前進!
	// CV模塊中包含了圖像處理,圖像結構分析  
// 運動描述和跟蹤,模式識別和攝像機標定  
#include"cv.h"  
  
//包含了圖像和視頻的輸入和輸出  
#include"highgui.h"  
  
// 用來標定滾動條當前的位置  
 int g_Pos = 0; 
 //用來用作滾動條播放幀數的計數器
  int frame_count=0;
 // 將打開的視頻文件作爲一個全局變量使用  
 CvCapture* g_Capture = NULL;  
  
 // 當拖動滾動條後,會回調這個函數  
 // 同時會將當前滾動條的位置以32位形式傳遞過來  
 void CallBackTrackBarSlide(int pos)  
 {  
     // 這裏便是重新設置的視頻文件當前播放的幀  
   cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);  
	//令計數器的值等於被拖動後的幀值
	frame_count=pos;
 }  
  
 // 主函數  
 int main(int argc, char** argv)  
 {   
	
     // 創建一個名爲vediox的窗口   
    cvNamedWindow("vediox",CV_WINDOW_AUTOSIZE);  
  
     // 根據參數打開指定的視頻文件  
    g_Capture = cvCreateFileCapture("C:\\Users\\wxh\\Documents\\Visual Studio 2010\\Projects\\初試牛刀\\初試牛刀\\1.f4v");  
	
     // 獲取總的幀數  
  int totalFrames =   
        (int) cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);  
  
    if(totalFrames != 0)  
    {      
        // 創建滾動條,在這裏指定了滾動條拖動後的回調函數  
        cvCreateTrackbar("TrackBar","vediox",&g_Pos,totalFrames,CallBackTrackBarSlide);  
    }  
      g_Pos=frame_count;
      IplImage* frame;  
     // 循環地順序遍歷所有的幀  
    while(1)  
    {  
		
        // 獲取當前幀的下一個幀,並將其加載到內存中  
        frame = cvQueryFrame(g_Capture);  
        if(!frame)  
        {  
            break;  
        }   cvShowImage("vediox",frame);  
        char chKeyCode = cvWaitKey(30);  
        if(chKeyCode == 27)  
        {  
            break;  
        } 
		//令計數器的值每進行一次while循環後自動加1
		frame_count++;
		//令當前滾動條的位置與計數器同步
		g_Pos=frame_count;
		//重新設置滾動條
		cvSetTrackbarPos("TrackBar","vediox",g_Pos); 
    }  
  //釋放內存
    cvReleaseCapture(&g_Capture);  
    cvDestroyWindow("vediox");  
  
    return 0;  
}


註釋:
cvCreateFileCapture(char* name)
通過輸入要讀取的視頻文件的路徑,然後,該函數返回一個指向CvCapture結構體的指針。

cvQueryFrame(captuer)
輸入一個CvCapture類型的指針,
該函數的主要功能是將視頻文件的下一幀加載到內存。
與cvLoadImage的不同之處:該函數不會重新分配內存空間。

C=cvWaitKey(33)
作用:
1.當前幀被顯示後,等待33毫秒。
  如果遊湖觸發了一個按鍵,C會被設置成這個按鍵的ASCLL嗎,否則會被設成-1.
2.cvWaitKey(33)在此處的另外一個作用:控制幀率。


cvReleaseCapture(&Capture)
1.釋放爲CvCapture結構體開闢的內存空間。
2.關閉打開的視頻文件相關的文件句柄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章