Opencv讀取視頻代碼
#include "stdafx.h"
#include"highgui.h"
int main(int argc,char* argv[])
{
cvNamedWindow( "avi");
CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi");
IplImage* frame;
while(1)
{
frame = cvQueryFrame(capture);
if(!frame) break ;
cvShowImage( "avi",frame);
char c = cvWaitKey(33);
if(c == 27)
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow( "avi");
return 0;
}
結構體 CvCapture
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文件相關的文件句柄
視頻的使用和操作具體說明:
- 對攝像頭初始化捕捉
- CvCapture* capture=cvCaptureFromCAM(0);//從攝像頭0捕捉
- 對文件初始化捕捉
- CvCapture* capture=cvCaptureFromAVI("/home/lubo/....avi");//從文件捕捉
- 捕捉某一幀
- IplImage* img=0;
- 方法一
- if(!cvGrabFrame(capture)){ //捕獲失敗 exit(0); }
- img=cvRetrieveFrame(capture);
- 方法二
- img=cvQueryFrame(capture);
- 如果同時從幾個攝像頭捕捉,應該先從每一個攝像頭抓取圖像,抓取結束后再捕捉圖像
- 釋放捕捉源(圖像是由捕捉函數分配和釋放的,所以不要釋放圖像)
- cvReleaseCapture(&capture);
獲取視頻幀信息
- 獲得捕捉裝置的屬性
-
cvQueryFrame(capture); int frameH=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);//視頻的高
CV_CAP_PROP_FRAME_COUNT//幀數 CV_CAP_PROP_FOURCC //4-character code of codec
CV_CAP_PROP_BRIGHTNESS//亮度 CV_CAP_PROP_CONTRAST//對比度
CV_CAP_PROP_SATURATION//飽和度 CV_CAP_PROP_HUE//色調 - 獲得幀的當前位置
-
CV_CAP_PROP_POS_MSEC //視頻當時的毫秒數或者視頻的時間戳
-
CV_CAP_PROP_POS_FRAME//0-based
保存視頻文件
- 初始化視頻寫入
-
CvCideoWriter* writer=0;
-
int isColor=1;
-
int fps=25;//30
-
int frameW=640;
-
int frameH=480;
- 視頻寫入的格式還有
-
CV_FOURCC('M','J','P','G');
-
CV_FOURCC('M','P','4','2');
-
CV_FOURCC('D','I','V','X');
-
CV_FOURCC('U','2','6','3');
-
CV_FOURCC('I','2','6','3');
-
CV_FOURCC('F','L','V','1');
- 寫入視頻文件
-
IplImage* img=0;
-
int nFrames=50;
-
for(int i=0;i<nFrames;i++){
-
cvGrabFrame(capture);
-
img=cvRetreveFrame(capture);
-
cvWriteFrame(writer,img);
- 釋放視頻寫入
cvReleaseVideoWriter(&writer);