OpenCV中提供了一個函數cvGetCaptureProperty(Capture* cap,int property_index)函數來獲取視頻文件的一些屬性,這是其中的OpenCV中屬性的一些宏定義:
#define CV_CAP_PROP_POS_MSEC 0
#define CV_CAP_PROP_POS_FRAMES 1
#define CV_CAP_PROP_POS_AVI_RATIO 2
#define CV_CAP_PROP_FRAME_WIDTH 3
#define CV_CAP_PROP_FRAME_HEIGHT 4
#define CV_CAP_PROP_FPS 5
#define CV_CAP_PROP_FOURCC 6
#define CV_CAP_PROP_FRAME_COUNT 7
#define CV_CAP_PROP_FORMAT 8
#define CV_CAP_PROP_MODE 9
#define CV_CAP_PROP_BRIGHTNESS 10
#define CV_CAP_PROP_CONTRAST 11
#define CV_CAP_PROP_SATURATION 12
#define CV_CAP_PROP_HUE 13
#define CV_CAP_PROP_GAIN 14
#define CV_CAP_PROP_EXPOSURE 15
#define CV_CAP_PROP_CONVERT_RGB 16
#define CV_CAP_PROP_WHITE_BALANCE 17
#define CV_CAP_PROP_RECTIFICATION 18
通過創建一個Capture對象的指針後,調用cvGetCaptureProperty即可獲取上述任何相關屬性;但是我們不能太依賴這個函數;比如我們想獲取一段視頻的幀數,我們就不能太依賴於CV_CAP_PROP_FRAME_COUNT這個屬性;因為cvGetCaptureProperty對屬性的訪問,其實訪問的是關聯視頻文件的文件頭信息,並不是真正去訪問了視頻的圖像數據,這就帶來一個問題:我們在講其他視頻格式轉換為AVI格式的時候,圖像幀數並沒改變,只是視頻文件頭改變了,這時直接通過get函數讀取的信息就可能不准確;最好的辦法是迭代從視頻中取出一幀,檢查是否有數據,來確定該視頻文件的總共幀數~~~
不光是幀數,幀率也可能不對~~
比如,自己在實驗中庸狸窩轉換器將一段視頻轉換為avi格式的視頻文件後,用下面的兩段代碼,結果差距很大:
code 1.
CvCapture *cap = cvCaptureFromFile(videoName);//獲取視頻
int numFrames = (int) cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);//得到視頻幀數,筆者獲得的結果為148
code 2.
IplImage* pImg=NULL;
int count=0;
while((pImg=cvQueryFrame(cap))!=NULL)
{
count++;
}//得到的幀數只有60幀;
究其原因其實就是cvGetCaptureProperty實現的機制上,它只是讀取視頻文件頭信息,而不是真正讀取了視頻文件;因此在進行不同格式的視頻文件轉換為OpenCV支持的AVI時,可能獲取的屬性並不准確~~~
因此在使用該函數時,要注意。自己的經驗是對於原始的AVI文件,可以直接使用該函數(code1),而經過轉換而得到的視頻文件,最好使用code 2。。
其實最希望的是OpenCV能夠支持更多的視頻格!
--------------------------------------分割線 --------------------------------------
Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm
Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm
CentOS下OpenCV無法讀取視頻文件 http://www.linuxidc.com/Linux/2011-07/39295.htm
Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm
Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm
基於QT和OpenCV的人臉識別系統 http://www.linuxidc.com/Linux/2011-11/47806.htm
--------------------------------------分割線 --------------------------------------
OpenCV的詳細介紹:請點這裡
OpenCV的下載地址:請點這裡