打開視頻文件或攝像頭視頻需要使用Opencv中的VideoCapture類,保存視頻或攝像頭視頻到本地磁盤,需要使用Opencv中的VideoWriter類。
VideoWriter類的一個常用構造方式如下:
VideoWriter(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
其中fourcc代表了所使用的編碼方式,如果輸入-1,則會在運行時候彈出選擇對話框,可以選擇編碼器:
filename 輸出視頻文件名。
fourcc為 四個字符用來表示壓縮幀的codec 例如:
CV_FOURCC('P','I','M','1') = MPEG-1 codec CV_FOURCC('M','J','P','G') = motion-jpeg codec 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,則運行時會彈出一個編碼器選擇框.
fps 被創建視頻流的幀率。
frame_size 保存視頻的寬和高。
isColor如果非零,編 碼器將希望得到彩色幀並進行編碼;否則,是灰度幀(只有在Windows下支持這個標志)。
備注:
生成文件占用空間最小的編碼方式是MPEG-4.2 codec。在VideoWriter類的構造函數參數為CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,對應在VideoWriter類的構造函數參數為CV_FOURCC('P','I','M','1') ,所占磁盤空間是前者的5.7倍。所以如果需要24小時全天候錄制監控,可以優先使用MPEG-4.2的編解碼方式。
例子:
錄制攝像頭視頻到本地
1 #include <stdio.h>
2 #include <opencv2/core/core.hpp>
3 #include <opencv2/highgui/highgui.hpp>
4 #include <opencv2/imgproc/imgproc.hpp>
5
6 using namespace std; 7 using namespace cv; 8
9
10 int main() 11 { 12 VideoCapture cap(0); 13
14 if (!cap.isOpened()) 15 { 16 printf("open video failed!\n"); 17 return 1; 18 } 19
20 Mat Frame; 21
22 //設置保存的視頻幀數目
23 int frameNum = 100; 24 //保存視頻的路徑
25 string outputVideoPath = "..\\test.avi"; 26 //獲取當前攝像頭的視頻信息
27 cv::Size sWH = cv::Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH), 28 (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT)); 29 VideoWriter outputVideo; 30 outputVideo.open(outputVideoPath, CV_FOURCC('M', 'P', '4', '2'), 25.0, sWH); 31
32 while (cap.isOpened() && frameNum > 0) 33 { 34 cap >> Frame; 35 if (Frame.empty()) break; 36 outputVideo << Frame; 37 frameNum--; 38
39 imshow("img", Frame); 40 waitKey(10); 41
42 if (char(waitKey(1)) == 'q') break; 43 } 44
45 outputVideo.release(); 46 system("pause"); 47 }
可能遇到的問題:
1.打不開視頻或攝像頭
①.本地視頻的輸入路徑有問題,例如下面所示:
string outputVideoPath = "C:\Users\Test\Testopencv\3.avi";
上述方式會因為轉義符而出現問題。
正確的路徑命名方式為:
string outputVideoPath = "C:\\Users\\Test\\Testopencv\\3.avi"; string outputVideoPath = "C:/Users/Test/Testopencv/3.avi";
②.攝像頭前幾幀出現空幀
解決辦法:多次加載視頻,cap>>Frame直至圖像不為空
③.編碼格式不對
在open函數中第二個參數是編碼格式,一定按照提供的編碼格式進行填寫,在應用中最好的解決方法是為-1。
2.保存文件為空
可能是后綴名的問題,嘗試使用.avi。
3.保存文件打不開
可能是幀率及圖像寬高設置有誤