OpenCV VideoWriter保存攝像頭視頻、本地視頻等


打開視頻文件或攝像頭視頻需要使用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.保存文件打不開

可能是幀率及圖像寬高設置有誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM