1. 程式人生 > >OpenCV寫入的視頻

OpenCV寫入的視頻

ola 視網膜 bsp ble 輸入 pro inline height -cp

分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

1、cvCreateVideoWriter()中的第二個參數:avi對應的編碼格式分別為:
CV_FOURCC(‘P‘,‘I‘,‘M‘,‘1‘) = MPEG-1 codec
CV_FOURCC(‘M‘,‘J‘,‘P‘,‘G‘) = motion-jpeg codec (does not work well)
CV_FOURCC(‘M‘, ‘P‘, ‘4‘, ‘2‘) = MPEG-4.2 codec
CV_FOURCC(‘D‘, ‘I‘, ‘V‘, ‘3‘) = MPEG-4.3 codec
CV_FOURCC(‘D‘, ‘I‘, ‘V‘, ‘X‘) = MPEG-4 codec
CV_FOURCC(‘U‘, ‘2‘, ‘6‘, ‘3‘) = H263 codec
CV_FOURCC(‘I‘, ‘2‘, ‘6‘, ‘3‘) = H263I codec
CV_FOURCC(‘F‘, ‘L‘, ‘V‘, ‘1‘) = FLV1 codec
將上面的改成 -1 將會打開一個編碼器的選擇窗口.

2、視頻灰度化後寫入(轉:http://www.pengjun.org.cn/post/22.html)

其中的藍色代碼即可將視頻顯示出來

#include <cv.h>
#include <highgui.h>

int main(int argc,char* argv[])
{
//如果輸入參數不為3,則退出程序
if(argc!=3) return -1;
//新建CvCapture*類型變量
CvCapture *capture=NULL;
//用cvCreateFileCapture函數從第一個輸入參數讀入視頻文件
capture=cvCreateFileCapture(argv[1]);
//如果讀入視頻文件失敗,則退出程序
if(!capture) return
-1; //用cvQueryFrame函數獲取視頻文件的第一幀保存到bgr_frame中 IplImage *bgr_frame=cvQueryFrame(capture); //用cvGetCaptureProperty函數獲取視頻文件的幀率,使輸入視頻的幀率與其一致 double fps=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS); //用cvSize函數建立一個CvSize類型的變量size,其寬度和高度與輸入視頻文件相同 CvSize size=cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT)); //用cvCreateVideoWriter函數新建一個CvVideoWriter*類型變量,用來輸出視頻文件 CvVideoWriter *writer=cvCreateVideoWriter(argv[2],CV_FOURCC(‘M‘,‘J‘,‘P‘,‘G‘), fps,size); cvnamedWindow("mainwin", CV_WINDOW_AUTOSIZE);//創建一個窗口顯示修改後的視頻; //用cvCreateImage函數創建一個IplImage*類型變量logpolar_frame IplImage *logpolar_grame=cvCreateImage(size,IPL_DEPTH_8U,3); //用cvQueryFrame函數繼續讀入輸入視頻文件,直到文件尾 while((bgr_frame=cvQueryFrame(capture))!=NULL) { //用cvLogPolar函數把圖像映射到極指數空間 cvLogPolar(bgr_frame,logpolar_grame,cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS); //用cvWriteFrame函數將極指數空間的圖像保存到writer中 cvWriteFrame(writer,logpolar_frame); cvShowImage("mainwin", logpolar_frame); //在mainwin窗口中顯示生成的視頻; char c=cvWaitkey(33); if (c == 27) break; //當輸入ESC鍵時,退出窗口; } //轉化完畢,用cvReleaseVideoWriter函數釋放CvVideoWriter*類型變量所占內存空間 cvReleaseVideoWriter(&writer); //用cvReleaseImage函數釋放IplImage*類型變量所占內存空間 cvReleaseImage(&logpolar_frame); //用cvReleaseCapture函數釋放CvCapture*類型變量所占內存空間 cvReleaseCapture(&capture); //程序結束,返回0 return 0; }

需要記住:
1、用cvCreateVideoWriter函數創建視頻文件寫入器,其具體參數如下:
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps,
CvSize frame_size, int is_color=1 );
filename:輸出視頻文件名。
fourcc:四個字符用來表示壓縮幀的codec 例如,CV_FOURCC(‘P‘,‘I‘,‘M‘,‘1‘)是MPEG-1 codec,
CV_FOURCC(‘M‘,‘J‘,‘P‘,‘G‘)是motion-jpeg codec等。
在Win32下,如果傳入參數-1,可以從一個對話框中選擇壓縮方法和壓縮參數。
fps :被創建視頻流的幀率。
frame_size :視頻流的大小。
is_color :如果非零,編碼器將希望得到彩色幀並進行編碼;否則,是灰度幀(只有在Windows下支持這個標誌)。
2、 用cvLogPolar函數將圖像映射到極指數空間(與極坐標類似,不過橫坐標是去Log之後的值)。具體參數:
void cvLogPolar( const CvArr* src, CvArr* dst,
CvPoint2D32f center, double M,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
src :輸入圖像。
dst :輸出圖像。
center :變換的中心,輸出圖像在這裏最精確。
M :幅度的尺度參數,見下面公式:
rho=M*log(sqrt(x2+y2))
phi=atan(y/x)
flags :插值方法和以下選擇標誌的結合;
CV_WARP_FILL_OUTLIERS -填充輸出圖像所有像素,如果這些點有和外點對應的,則置零。
CV_WARP_INVERSE_MAP - 表示矩陣由輸出圖像到輸入圖像的逆變換,並且因此可以直接用於像素插值。否則,函數從map_matrix中尋找逆變換。
fillval :用於填充外點的值。

函數cvLogPolar用以下變換變換輸入圖像:
正變換 (CV_WARP_INVERSE_MAP 未置位): dst(phi,rho)<-src(x,y)
逆變換 (CV_WARP_INVERSE_MAP 置位): dst(x,y)<-src(phi,rho),
此函數模仿人類視網膜中央凹視力,並且對於目標跟蹤等可用於快速尺度和旋轉變換不變模板匹配。
3、用CvPoint2D32f函數來創建一個二維坐標下的點,類型為浮點,其定義如下:
typedef struct CvPoint2D32f
{
float x; /* X坐標, 通常以0為基點*/
float y; /* Y坐標, 通常以0為基點*/
}
CvPoint2D32f;
/* 構造函數 */
inline CvPoint2D32f cvPoint2D32f( double x, double y );
/* 從CvPoint轉換來 */
inline CvPoint2D32f cvPointTo32f( CvPoint point );
4、用cvWriteFrame函數將一幀圖像寫入到視頻文件寫入器中。
5、用cvReleaseVideoWriter來釋放視頻寫入器的所占的內存空間



再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

OpenCV寫入的視頻