【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解
OpenCV3和OpenCV2類(lèi)似,視頻的讀、寫(xiě)操作,分別通過(guò)cv::VideoCapture和cv::VideoWriter兩個(gè)類(lèi)來(lái)實(shí)現(xiàn)。
1、視頻的讀取操作cv::VideoCapture
cv::VideoCapture既支持視頻文件的讀取,也支持從攝像機(jī)中視頻的讀取。cv::VideoCapture對(duì)象的創(chuàng)建方式有以下三種:
cv::VideoCapture capture(const string& filename, // 輸入文件名);cv::VideoCapture capture(int device // 視頻捕捉設(shè)備 id);cv::VideoCapture capture();
第二種方式是從攝像機(jī)中讀取視頻,這種情況下,我們會(huì)給出一個(gè)標(biāo)識(shí)符,用于表示我們想要訪問(wèn)的攝像機(jī),及其與操作系統(tǒng)的握手方式。對(duì)于攝像機(jī)而言,這個(gè)標(biāo)志符就是一個(gè)標(biāo)志數(shù)字——如果只有1個(gè)攝像機(jī),那么就是0,如果系統(tǒng)中有多個(gè)攝像機(jī),那么只要將其向上增加即可。標(biāo)識(shí)符另外一部分是攝像機(jī)域(camera domain),用于表示攝像機(jī)的類(lèi)型,這個(gè)域值可以是下面任一預(yù)定義常量。
以這種方式創(chuàng)建視頻捕獲對(duì)象時(shí),我們所傳遞的標(biāo)識(shí)符是域索引和攝像機(jī)索引的和。例如:
cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);
這個(gè)例子中cv::VideoCapture將嘗試打開(kāi)第2個(gè)(編號(hào)從0開(kāi)始)1394攝像機(jī)。多數(shù)情況下,由于我們只有一個(gè)攝像機(jī),因此沒(méi)必要指定攝像機(jī)的域,此時(shí)使用cv::CAP_ANY是一種高效的方式(也即是0,所以不用特意指定)。
第三種方式僅僅創(chuàng)建一個(gè)捕獲對(duì)象,而不提供任何關(guān)于打開(kāi)的信息。創(chuàng)建以后通過(guò)成員函數(shù)open()來(lái)設(shè)定打開(kāi)的信息。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的成員函數(shù)get()并設(shè)定標(biāo)識(shí)cv::CAP_PROP_FRAME_COUNT獲取了讀取視頻的幀總數(shù)。同樣,我們可以指定其他標(biāo)識(shí),來(lái)獲取讀取視頻或攝像頭的其他屬性。另外,我們也可以使用成員函數(shù)set(),設(shè)定相應(yīng)屬性的值。cv::VideoCapture中提供的屬性標(biāo)識(shí)如下圖所示。
2、視頻的寫(xiě)操作cv::VideoWriter
cv::VideoWriter對(duì)象的創(chuàng)建有兩種方式,第一種是使用構(gòu)造函數(shù)的形式,第二種使用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 // 只輸入彩色圖);
同樣,向創(chuàng)建后的cv::VideoWriter對(duì)象寫(xiě)入圖像也有兩種方式,即write()操作和“<<”操作:
cv::VideoWriter::write(const Mat& image // 寫(xiě)入圖像作為下一幀);my_video_writer << my_frame;
2017.03.30
總結(jié)
以上是生活随笔為你收集整理的【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【OpenCV3】OpenCV3.2.0
- 下一篇: 【OpenCV3】几何图形(直线、矩形、