int main( int argc, char** argv )
{
//========================================================
// CvCapture 是一個結構體,用來儲存映像捕獲所需要的資訊。
// opencv提供兩種方式從外部捕獲映像,一種是從網路攝影機中,一種
// 是通過解碼視頻得到映像。兩種方式都必須從第一幀開始一幀一幀
// 的按順序擷取,因此每擷取一幀後都要儲存相應的狀態和參數。
// 比如從視頻檔案中擷取,需要儲存視頻檔案的檔案名稱,相應的******
// 類型,下一次如果要擷取將需要解碼哪一幀等。 這些資訊都儲存在
// CvCapture結構中,每擷取一幀後,這些資訊都將被更新,擷取下一幀
// 需要將新資訊傳給擷取的api介面
//=======================================================
CvCapture* capture = 0;
//===========================================================
// IplImage 是結構體類型,用來儲存一幀映像的資訊,也就是一幀
// 映像的所有像素值構成的一個矩陣
//===========================================================
IplImage *frame, *frame_copy = 0;
// 建立一個視窗,用“result”作為視窗的標識符
cvNamedWindow( "result", 1 );
// ==========================================
// 初始化一個視頻捕獲操作。
// 告訴底層的捕獲api我想從 Capture1.avi中捕獲圖片,
// 底層api將檢測並選擇相應的******並做好準備工作
//==============================================
capture = cvCaptureFromFile("c://Capture1.avi")
// 如果 初始化失敗,那麼capture為空白指標,程式停止,
// 否則進入捕獲迴圈
if( capture )
{
// 捕獲迴圈
for(;;)
{
// 調用cvGrabFrame,讓底層api解碼一幀映像
// 如果解碼失敗,就退出迴圈
// 如果成功,解碼的映像儲存在底層api的緩衝中
if( !cvGrabFrame( capture ))
break;
// 將解碼得到映像資訊從緩衝中轉換成IplImage格式放在frame中
frame = cvRetrieveFrame( capture );
// 如果擷取緩衝或轉換失敗,則退出迴圈
if( !frame )
break;
// 將frame中的映像資訊在視窗result中顯示
cvShowImage( "result", frame );
// 暫停一會兒,讓你看一像
Sleep(66.9);
// 如果你敲了鍵盤,就退出程式,否則繼續捕獲下一幀
if( cvWaitKey( 10 ) >= 0 )
break;
}
// 退出程式之前要清理一下堆棧中的記憶體,免得記憶體泄露
//cvReleaseImage( &frame );注意不需要這句,因為frame是從視頻中捕獲的,沒有單獨分配記憶體,無需釋放,當capture 釋放的時候frame自然就釋放了。
// 退出之前結束底層api的捕獲操作,免得它們佔著茅坑不拉屎
// 比如會使得別的程式無法訪問已經被它們開啟的檔案
cvReleaseCapture( &capture );
}
cvDestroyWindow("result");
return 0;
}
夠清楚了吧,good luck