-
-
-
-
-
#include"cv.h"
-
-
-
#include"highgui.h"
-
-
-
int g_Pos = 0;
-
-
-
CvCapture* g_Capture = NULL;
-
-
-
-
void CallBackTrackBarSlide(int pos)
-
{
-
-
cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);
-
}
-
-
-
int main(int argc, char** argv)
-
{
-
-
cvNamedWindow("vediox",CV_WINDOW_AUTOSIZE);
-
-
-
g_Capture = cvCreateFileCapture("vedio.avi");
-
-
-
int totalFrames =
-
(int) cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);
-
-
if(totalFrames != 0)
-
{
-
-
cvCreateTrackbar("TrackBar","vediox",&g_Pos,totalFrames,CallBackTrackBarSlide);
-
}
-
-
IplImage* frame;
-
-
while(1)
-
{
-
-
frame = cvQueryFrame(g_Capture);
-
if(!frame)
-
{
-
break;
-
}
-
cvShowImage("vediox",frame);
-
char chKeyCode = cvWaitKey(30);
-
if(chKeyCode == 27)
-
{
-
break;
-
}
-
}
-
-
cvReleaseCapture(&g_Capture);
-
cvDestroyWindow("vediox");
-
-
return 0;
-
}
該段代碼的滾動條會隨視頻播放而前進!
// 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.關閉打開的視頻文件相關的文件句柄。