OpenCV參考手冊之CvCapture結構體
1、CvCapture結構體:
CvCapture是一個結構體,用來儲存影象捕獲的資訊,就像一種資料型別(如int,char等)只是存放的內容不一樣,在OpenCv中,它最大的作用就是處理視訊時(程式是按一幀一幀讀取),讓程式讀下一幀的位置,CvCapture結構中,每獲取一幀後,這些資訊都將被更新,獲取下一幀回覆。
2、cvCreateFileCapture(const char* mov)
cvCreateFileCapture()通過引數設定確定要讀入的avi檔案,返回一個指向CvCapture結構的指標。這個結構包括了所有關於要讀入avi檔案的資訊,其中包含狀態資訊。呼叫這個函式之後,返回指標所指向的CvCapture結構唄初始化到對應的avi檔案的開頭。
3、IplImage* cvCreateImage(CvSize size,int depth,int channels);
cvCreateImage:建立首地址並且分配儲存空間:IplImage* cvCreateImage(CvSize size,int depth,int channels);
//size:影象的寬、高;depth:影象元素的位深度,可以是一下其中之一:
IPL_DEPTH_8U - 無符號8位整型
IPL_DEPTH_8S - 有符號8位整型
IPL_DEPTH_16U - 無符號16位整型
IPL_DEPTH_16S - 有符號16位整型
IPL_DEPTH_32S - 有符號32位整型
IPL_DEPTH_32F - 單精度浮點數
IPL_DEPTH_64F - 雙精度浮點數
4、cvSetTrackbarPos("進度條名稱","視窗名稱",pos):
這個函式要和另外兩個函式配套使用,一個是回撥函式,也就是響應滑鼠的函式(即下面的CvTrackbarCallback on_change),這個是自定義的。第二個是建立函式cvCreateTrackbar(),這個函式的最後一個引數是前面回撥函式,用來建立一個進度條。
關於cvSetTrackbarPos,他有3個引數cvSetTrackbarPos("進度條名稱","視窗名稱",pos)。第三個引數是當前進度條的位置,可以按照視訊幀數的比例來設定當前進度值,也可以用迴圈pos++來設定。
5、cvQueryFrame(CvCapture* capture):
表示從攝像頭或者檔案中抓取並返回一幀。
IplImage* cvQueryFrame(CvCapture* capture);函式cvQueryFrame從攝像頭或者檔案中抓取一幀,然後解壓並且返回這一幀。這個函式僅僅是函式cvGrabFrame和函式cvRetrieveFrame在一起呼叫的組合。返回的影象不可以被使用者釋放或者修改。
cvQueryFrame的引數是CvCapture結構的指標。用來將下一幀視訊檔案載入記憶體,返回一個對應當前幀的指標。與cvLoadImage不同的是cvLoadImage為影象分配記憶體空間,而cvQueryFrame使用已經在cvCapture結構中分配好的記憶體,這樣就沒必要通過cvReleaseImage()對這個返回的影象指標進行釋放,當CvCapture結構被釋放後,每一幀影象對應的記憶體空間會被釋放。
6、CvCaptureFromCAM(int index):
初始化從攝像頭中獲取視訊:CvCapture* cvCaptureFromCAM(int index);
index:要使用的攝像頭索引。如果只有一個攝像頭或者用哪個攝像頭也無所謂,那麼使用引數-1便可以。
函式給從攝像頭的視訊流分配和初始化CvCapture結構。
7、cvCreateTrackbar(const char* trackbar_name,const char* window_name,int* value,int count,CvTrackbarCallback on_change);
該函式為開放計算機視覺(OpenCV)庫庫函式,建立trackbar並將它新增到指定的視窗。
定義:
CV_EXTERN_C_FUNCPTR(void (*CvTrackbarCallback)(int pos));
int cvCreateTrackbar(const char* trackbar_name,const char* window_name,int* value,int count,CvTrackbarCallback on_change);
引數:
trackbar_name:被建立的trackbar名字
window_name:視窗名字,這個視窗將為被建立trackbar的父物件
value:整數指標,它的值將反映滑塊的位置,這個變數指定建立時的滑塊位置。
count:滑塊位置的最大值。最小值一直是0
on_change:每次滑塊位置被改變的時候,被呼叫函式的指標。這個函式應該被宣告為void Foo(int),如果沒有回撥函式,這個值可以設定為NULL。
函式cvCreateTrackbar用指定的名字和範圍來建立trackbar(滑塊或者範圍控制),指定與trackbar位置同步的變數,並且指定當trackbar位置被改變的時候呼叫的回撥函式。
被建立的trackbar預設顯示在指定視窗的頂端,可以通過cvGetTrackbarPos來獲取trackbar顯示的位置資訊,以及通過函式cvSetTrackbarPos來重新設定trackbar的位置。
8、double cvGetCaptureProperty(CvCapture* capture,int property_id);
double cvGetCaptureProperty(CvCapture* capture,int property_id)獲取視訊檔案的一些屬性,
//capture 視訊獲取結構;property_id 屬性標識。
以下是OpenCV屬性的一些巨集定義:
CV_CAP_PROP_POS_MSEC //影片目前位置,為毫秒數或者視訊獲取時間戳
CV_CAP_PROP_POS_FRAMES //將被下一步解壓/獲取的幀索引,以0為起點
CV_CAP_PROP_POS_AVI_RATIO //視訊檔案的相對位置(0 - 影片的開始,1 - 影片的結尾)
CV_CAP_PROP_FRAME_WIDTH //視訊流中的幀寬度
CV_CAP_PROP_FRAME_HEIGHT //視訊流中的幀高度
CV_CAP_PROP_FPS //幀率
CV_CAP_PROP_FOURCC //表示codec的四個字元
CV_CAP_PROP_FRAME_COUNT // 視訊檔案中幀的總數
CV_CAP_PROP_FORMAT
CV_CAP_PROP_MODE
CV_CAP_PROP_BRIGHTNESS
CV_CAP_PROP_CONTRAST
CV_CAP_PROP_SATURATION
CV_CAP_PROP_HUE
CV_CAP_PROP_GAIN
CV_CAP_PROP_EXPOSURE
CV_CAP_PROP_CONVERT_RGB
CV_CAP_PROP_WHITE_BALANCE
CV_CAP_PROP_RECTIFICATION
通過建立一個Capture物件的指標後,呼叫cvGetCaptureProperty即可獲取上述任何相關屬性;但是我們不能太依賴這個函式;比如我們想獲取一段視訊的幀數,我們就不能太依賴於CV_CAP_PROP_FRAME_COUNT這個屬性;因為cvGetCaptureProperty對屬性的訪問,其實訪問的是關聯視訊檔案的檔案頭資訊,並不是真正去訪問了視訊的影象資料,這就帶來一個問題:我們在講其他視訊格式轉換為AVI格式的時候,影象幀數並沒改變,只是視訊檔案頭改變了,這時直接通過get函式讀取的資訊就可能不準確;最好的辦法是迭代從視訊中取出一幀,檢查是否有資料,來確定該視訊檔案的總共幀數~~~
例如:
示例1:
CvCapture* cap = cvCaptureFromFile(videoName);//獲取視訊
int numFrames = (int) cvGetCaptureProperty(cap,CV_CAP_PROP_FRAME_COUNT);//得到視訊幀數,
//得到的幀數是148幀
示例2:[較好的方法]
IplImage* pImg = NULL;
int count = 0;
while((pImg = cvQueryFrame(cap))!=NULL){
count++;
}//得到的幀數只有60幀
9、cvSetCaptureProperty
int cvSetCaptureProperty(CvCapture* capture,int property_id,double value);
注意此方法定位並不準確
capture:視訊獲取結構
property_id:屬性識別,可以是下面之一:
CV_CAP_PROP_POS_MSEC //從檔案開始的位置,單位為毫秒
CV_CAP_PROP_POS_FRAMES //單位為幀數的位置(只對視訊檔案有效)
CV_CAP_PROP_POS_AVI_RATIO // 視訊檔案的相對位置(0 - 影片的開始,1 - 影片的結尾)
CV_CAP_PROP_FRAME_WIDTH //視訊流的幀寬度(只對攝像頭有效)
CV_CAP_PROP_FRAME_HEIGHT //視訊流的幀高度(只對攝像頭有效)
CV_CAP_PROP_FPS //幀率(只對攝像頭有效)
CV_CAP_PROP_FOURCC //表示codec的四個字元(只對攝像頭有效)
value表示的是屬性的值
10、cvSmooth
函式cvSmooth可以使用簡單模糊、簡單無縮放變換的模糊、中值模糊、高斯模糊、雙邊濾波的任何一種方法平滑影象。每一種方法都有自己的特點和侷限。沒有縮放的影象平滑僅支援單通道影象,並且支援8位到16位的轉換和32位浮點數到32為浮點數的變換格式。簡單模糊和高斯模糊支援1-或3-通道,8-位元和32-位元浮點影象。這兩種方法可以(in-place)方式處理影象。中值和雙向濾波工作於1-或3-通道,8-點陣圖像,但是不能以in-place方式處理影象。
void cvSmooth(const CvArr* src,CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3,int param2=0,double param3=0,double param4=0);
//src:輸入影象
//dst:輸出影象
//smoothtype:平滑方法
平滑方法如下:
CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊) - 對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函式 cvIntegral 計算積分影象。
CV_BLUR (simple blur) - 對每個象素param1×param2鄰域 求和並做尺度變換 1/(param1.param2).
CV_GAUSSIAN (gaussian blur) - 對影象進行核大小為 param1×param2 的高斯卷積
CV_MEDIAN (median blur) - 對影象進行核大小為param1×param1 的中值濾波(i.e. 鄰域是方的).
CV_BILATERAL (雙向濾波) - 應用雙向 3x3 濾波,彩色sigma=param1,空間 sigma=param2. 平滑操作的第一個引數.
param2:
平滑操作的第二個引數. 對於簡單/非尺度變換的高斯模糊的情況,如果param2的值 為零,則表示其被設定為param1。
param3:
對應高斯引數的 Gaussian sigma (標準差). 如果為零,則標準差由下面的核尺寸計算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核,
n=param2 對應垂直核.
對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標準 sigma 速度會快。如果 param3 不為零,而 param1 和 param2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作).
函式 cvSmooth 可使用上面任何一種方法平滑影象。每一種方法都有自己的特點以及侷限。
沒有縮放的影象平滑僅支援單通道影象,並且支援8位到16位的轉換(與cvSobel和cvLaplace相似)和32位浮點數到32位浮點數的變換格式。
簡單模糊和高斯模糊支援 1- 或 3-通道, 8-位元 和 32-位元 浮點影象。這兩種方法可以(in-place)方式處理影象。
中值和雙向濾波工作於 1- 或 3-通道, 8-點陣圖像,但是不能以 in-place 方式處理影象.
11、cvGetSize
cvGetSize是Opencv提供的一種操作矩陣影象的函式
得到二維的陣列的尺寸,以CvSize返回。
CvSize cvGetSize(const CvArr* arr);
它與cvGetDims()密切相關,cvGetDim()返回一個數組的大小。主要的不同是cvGetSize()是專為矩陣和影象設計的,這兩種物件的維數總是2。其尺寸可以以CvSize結構的形式返回,例如當建立一個新的大小相同的矩陣或影象時,使用此函式就很方便。
12、cvSize
cvSize是OpenCV的基本資料型別之一。表示矩陣框大小,以畫素為精度。與CvPoint結構類似,但資料成員是integer型別的width和heigh
原型:
typedef struct CvSize
{
int width; /* 矩形寬 */
int height; /* 矩形高 */
}
CvSize;
13、cvPyrDown
功能:函式cvPyrDown使用Gaussian金字塔分解對輸入影象向下取樣
格式:void cvPyrDown(const CvArr* src,CvArr* dst,int filter = CV_GAUSSIAN_5x5);
引數:src:輸入影象、dst:輸出影象,其寬度和高度應是輸入影象的一半;filter:卷積濾波器型別,目前僅支援CV_GAUSSIAN_5x5。