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來釋放視頻寫入器的所佔的記憶體空間