日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解

發(fā)布時(shí)間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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();


第一種方式是從文件(.MPG或.AVI格式)中讀取視頻,對(duì)象創(chuàng)建以后,OpenCV將會(huì)打開(kāi)文件并做好準(zhǔn)備讀取它,如果打開(kāi)成功,我們將可以開(kāi)始讀取視頻的幀,并且cv::VideoCapture的成員函數(shù)isOpened()將會(huì)返回true(建議在打開(kāi)視頻或攝像頭時(shí)都使用該成員函數(shù)判斷是否打開(kāi)成功)。

第二種方式是從攝像機(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。