天天看點

初學圖像處理+opencv----讀取視訊

讀取視訊的前提,還需要安裝解碼器。剛開始我是有一定疑惑的,opencv中提供隻可以讀取avi格式視訊的功能,為什麼還需要安裝解碼器,感謝從ChenLee_l部落格http://blog.csdn.net/carson2005/article/details/6979806,得到了解答。重點就是,盡管OpenCV提供了一些讀寫視訊檔案的API,但是,它也僅僅是一個接口而已,其内部,依然需要調用相應的視訊編解碼器的API來進行解碼。

接下來我安裝了xvid,然後運作代碼。

代碼和解讀如下:

#include "highgui.h"
int main(int argc, char* argv[])
{
    cvNamedWindow("avi");
    CvCapture* capture = cvCreateFileCapture(“視訊檔案路徑");
    IplImage* frame;
    while(1)
    {
        frame = cvQueryFrame(capture);
        if(!frame)break;

        cvShowImage("avi",frame);
        char c = cvWaitKey(33);
        if(c==27)//esc ascII值
            break;
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("avi");
    return 0;
}
           

CvCapture 是一個結構體,用來儲存圖像捕獲所需要的資訊。 opencv提供兩種方式從外部捕獲圖像,一種是從攝像頭中,一種是通過解碼視訊得到圖像。 兩種方式都必須從第一幀開始一幀一幀的按順序擷取,是以每擷取一幀後都要儲存相應的狀态和參數。比如從視訊檔案中擷取,需要儲存視訊檔案的檔案名,相應的解碼器類型,下一次如果要擷取将需要解碼哪一幀等。 這些資訊都儲存在CvCapture結構中,每擷取一幀後,這些資訊都将被更新,擷取下一幀需要将新資訊傳給擷取的api接口。

cvCreateFileCapture(char*name):通過輸入要讀取的avi檔案的路徑,然後,該函數傳回一個指向CvCapture結構體的指針。

cvQueryFrame(capture):輸入一個CvCapture類型的指針,該函數主要功能是将視訊檔案的下一幀加載到記憶體。與cvLoadImage的不同之處是,該函數不重新配置設定記憶體空間。

C=cvWaitKey(33):目前幀被顯示後,等待33毫秒。如果使用者觸發了一個按鍵,c會被設定成這個按鍵的ASCII碼,否則會被設定成-1。cvWaitKey(33)在此處的另外一個作用是,控制幀率。

cvReleaseCapture(&capture):釋放為CvCapture結構體開辟的記憶體空間,關閉打開的AVI檔案相關的檔案句柄。

運作時我遇到一個問題,出現debug assertion failed,查找半天沒找出問題,後來在狸貓裡修改了轉換avi的格式為avi auto video後,竟然奇迹的成功運作。