【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解
OpenCV3和OpenCV2類似,視頻的讀、寫操作,分別通過cv::VideoCapture和cv::VideoWriter兩個類來實現。
1、視頻的讀取操作cv::VideoCapture
cv::VideoCapture既支持視頻文件的讀取,也支持從攝像機中視頻的讀取。cv::VideoCapture對象的創建方式有以下三種:
cv::VideoCapture capture(const string& filename, // 輸入文件名);cv::VideoCapture capture(int device // 視頻捕捉設備 id);cv::VideoCapture capture();
第二種方式是從攝像機中讀取視頻,這種情況下,我們會給出一個標識符,用于表示我們想要訪問的攝像機,及其與操作系統的握手方式。對于攝像機而言,這個標志符就是一個標志數字——如果只有1個攝像機,那么就是0,如果系統中有多個攝像機,那么只要將其向上增加即可。標識符另外一部分是攝像機域(camera domain),用于表示攝像機的類型,這個域值可以是下面任一預定義常量。
以這種方式創建視頻捕獲對象時,我們所傳遞的標識符是域索引和攝像機索引的和。例如:
cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);
這個例子中cv::VideoCapture將嘗試打開第2個(編號從0開始)1394攝像機。多數情況下,由于我們只有一個攝像機,因此沒必要指定攝像機的域,此時使用cv::CAP_ANY是一種高效的方式(也即是0,所以不用特意指定)。
第三種方式僅僅創建一個捕獲對象,而不提供任何關于打開的信息。創建以后通過成員函數open()來設定打開的信息。open()操作也有以上兩種方式。
cv::VideoCapture cap;cap.open( "my_video.avi" );
將視頻幀讀取到cv::Mat矩陣中,有兩種方式:一種是read()操作;另一種是 “>>”操作。
cv::Mat frame;cap.read(frame); //讀取方式一cap >> frame; //讀取方式二
下面是讀取視頻并顯示的示例代碼:
#include <opencv2/opencv.hpp> #include <iostream>void video_capture_test() {cv::VideoCapture capture("test.mp4");if (!capture.isOpened()){std::cout << "Read video Failed !" << std::endl;return;}cv::Mat frame;cv::namedWindow("video test");int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);std::cout << "total frame number is: " << frame_num << std::endl;for (int i = 0; i < frame_num - 1; ++i){capture >> frame;//capture.read(frame); 第二種方式imshow("video test", frame);if (cv::waitKey(30) == 'q'){break;}}cv::destroyWindow("video test");capture.release();return; }
上面的代碼,我們使用了cv::VideoCapture的成員函數get()并設定標識cv::CAP_PROP_FRAME_COUNT獲取了讀取視頻的幀總數。同樣,我們可以指定其他標識,來獲取讀取視頻或攝像頭的其他屬性。另外,我們也可以使用成員函數set(),設定相應屬性的值。cv::VideoCapture中提供的屬性標識如下圖所示。
2、視頻的寫操作cv::VideoWriter
cv::VideoWriter對象的創建有兩種方式,第一種是使用構造函數的形式,第二種使用open()的方式,具體如下:
cv::VideoWriter out(const string& filename, // 輸入文件名int fourcc, // 編碼形式,使用 CV_FOURCC()宏double fps, // 輸出視頻幀率cv::Size frame_size, // 單幀圖片的大小bool is_color = true // 如果是false,可傳入灰度圖像 );cv::VideoWriter out;out.open("my_video.mpg", //輸出文件名CV_FOURCC('D','I','V','X'), // MPEG-4 編碼30.0, // 幀率 (FPS)cv::Size( 640, 480 ), // 單幀圖片分辨率為 640x480true // 只輸入彩色圖);
同樣,向創建后的cv::VideoWriter對象寫入圖像也有兩種方式,即write()操作和“<<”操作:
cv::VideoWriter::write(const Mat& image // 寫入圖像作為下一幀);my_video_writer << my_frame;
2017.03.30
總結
以上是生活随笔為你收集整理的【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV3】OpenCV3.2.0
- 下一篇: 【OpenCV3】几何图形(直线、矩形、