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

OpenCV寫入的視訊

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                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_frameIplImage *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);//程式結束,返回0return 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來釋放視訊寫入器的所佔的記憶體空間



           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述