opencv寫入的視頻

來源:互聯網
上載者:User
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來釋放視頻寫入器的所佔的記憶體空間

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.