Posted on 2013-01-16 11:18
盛勝 閱讀(9934)
評(píng)論(4) 編輯 收藏 引用
網(wǎng)上很多都說錄制了之后視頻文件為0k,或者是打不開。
其實(shí),這個(gè)原因主要與2方面有關(guān):
1. OpenCV生成的視頻的編碼格式有關(guān)。
2. 非法退出錄取有關(guān)(我用200次循環(huán)解決。或者可以用Timer。或者用其他鍵處理)
vs2008 win32控制臺(tái)程序

1 #include "cv.h"
2 #include "cxcore.h"
3 #include "highgui.h"
4 #include <iostream>
5
6 using namespace std;
7 int main()
8 {
9 CvCapture* capture=cvCaptureFromCAM(-1);
10 CvVideoWriter* video=NULL;
11 IplImage* frame=NULL;
12 int n;
13 if(!capture) //如果不能打開攝像頭給出警告
14 {
15 cout<<"Can not open the camera."<<endl;
16 return -1;
17 }
18 else
19 {
20 frame=cvQueryFrame(capture); //首先取得攝像頭中的一幀
21 video=cvCreateVideoWriter("camera.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25,
22 cvSize(frame->width,frame->height)); //創(chuàng)建CvVideoWriter對(duì)象并分配空間
23 //保存的文件名為camera.avi,編碼要在運(yùn)行程序時(shí)選擇,大小就是攝像頭視頻的大小,幀頻率是32
24 if(video) //如果能創(chuàng)建CvVideoWriter對(duì)象則表明成功
25 {
26 cout<<"VideoWriter has created."<<endl;
27 }
28
29 cvNamedWindow("Camera Video",1); //新建一個(gè)窗口
30 int i = 0;
31 while(i <= 200) // 讓它循環(huán)200次自動(dòng)停止錄取
32 {
33 frame=cvQueryFrame(capture); //從CvCapture中獲得一幀
34 if(!frame)
35 {
36 cout<<"Can not get frame from the capture."<<endl;
37 break;
38 }
39 n=cvWriteFrame(video,frame); //判斷是否寫入成功,如果返回的是1,表示寫入成功
40 cout<<n<<endl;
41 cvShowImage("Camera Video",frame); //顯示視頻內(nèi)容的圖片
42 i++;
43 if(cvWaitKey(2)>0)
44 break; //有其他鍵盤響應(yīng),則退出
45 }
46
47 cvReleaseVideoWriter(&video);
48 cvReleaseCapture(&capture);
49 cvDestroyWindow("Camera Video");
50 }
51 return 0;
52 }