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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV读写视频文件解析

發(fā)布時(shí)間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV读写视频文件解析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OpenCV讀寫視頻文件解析

一.視頻讀寫類

視頻處理的是運(yùn)動(dòng)圖像,而不是靜止圖像。視頻資源可以是一個(gè)專用攝像機(jī)、網(wǎng)絡(luò)攝像頭、視頻文件或圖像文件序列。
在OpenCV 中,VideoCapture 類和 VideoWriter 類為視頻處理中所涉及的捕獲和記錄任務(wù)提供了一個(gè)易用的C++API。

cv::VideoCapture類

1、對(duì)象的構(gòu)造函數(shù),如下面的例子:

cv::VideoCapture capture(“D:\Camera Road 01.avi”);

參數(shù)為const string&,即讀入彩色圖像,若設(shè)置為0則讀取攝像頭。

2、驗(yàn)證視頻讀入是否成功,如下:

if (!capture.isOpened())
{ std::cout << “Vidoe open failed!” << std::endl; return -1; }

3、驗(yàn)證完成后,就可以開始讀取視頻啦!

cv::Mat frame;capture >> frame;

VideoCapture對(duì)象的操作可以像流一樣讀入到Mat類型的對(duì)象(即圖像)中。

cv::VideoWriter類

這個(gè)類是用來寫入一個(gè)視頻的,使用起來比capture麻煩一些。

構(gòu)造函數(shù) cv::VideoCapture(const string& path,int fourcc,double fps, Size framesize, bool isColor=true)

需要注意的是fourcc,cv::VideoWriter::fourcc(char c1, char c2, char c3, char c4)

常用的格式有

· 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

二.視頻讀寫示例

剩下的就與VideoCapture差不多了,不過是輸出流的操作。

下方的 recVideo 示例是一個(gè)簡(jiǎn)短的代碼片段,可以讓你了解如何使用一個(gè)默認(rèn)攝像機(jī)作為一個(gè)捕捉設(shè)備來抓取幀,對(duì)它們進(jìn)行邊緣檢測(cè),并且將新的轉(zhuǎn)換視頻幀作為一個(gè)文件保存。而且,創(chuàng)建兩個(gè)窗口同時(shí)顯示原始幀和處理過的幀。

recVideo 示例的代碼為:

  1. #include <opencv2/opencv.hpp>
  2. #include
  3. using namespace std;
  4. using namespace cv;
  5. int main(int, char **)
  6. {
  7. Mat in_frame, out_frame;
  8. const char win1[]=“Grabbing…”, win2[]=“Recording…”
  9. double fps=30;//每秒的幀數(shù)
  10. char file_out[]=“recorded.avi”;
  11. 1
  12. VideoCapture inVid(O) ; //打開默認(rèn)攝像
  13. if ( !inVid.isOpened () ) { //檢查錯(cuò)誤
  14. cout << “Error! Camera not ready…\n”;
  15. return -1;
  16. }
  17. //獲取輸入視頻的寬度和高度
  18. int width = (int)inVid.get(CAP_PROP_FRAME_WIDTH);2
  19. int height = (int)inVid.get(CAP_PR〇P_FRAME_HEIGHT);
  20. VideoWriter recVid(file out,VideoWriter::fourcc(‘M’,‘S’,‘V’,‘C’), fps, Size(width, height));
  21. if (!recVid.isOpened()) {
  22. cout << “Error! Video file not opened…\n”;
  23. return -1;
  24. }
  25. //為原始視頻和最終視頻創(chuàng)建兩個(gè)窗口
  26. namedWindow(win1);
  27. namedWindow(win2);
  28. while (true) {
  29. //從攝像機(jī)讀取幀(抓取并解碼)
  30. inVid >> in frame;
  31. //將幀轉(zhuǎn)換為灰度
  32. cvtColor(in_frame, out_frame, C0L0R_BGR2GRAY);
  33. //將幀寫入視頻文件(編碼并保存)
  34. recVid << out_frame ?
  35. imshow (win1, in_frame);// 在窗口中顯示幀
  36. imshow(win2, out_frame); // 在窗口中顯示幀
  37. if (waitKey(1000/fps) >= 0)
  38. break;
  39. }
  40. inVid.release(); // 關(guān)閉攝像機(jī)
  41. return 0;
    43.}

在本示例中,應(yīng)該快速瀏覽以下這些函數(shù):

· double VideoCapture::get(int propId):這個(gè)函數(shù)為一個(gè) VideoCapture 對(duì)象返回指定的屬性值。在 videoio.hpp 頭文件中包含了基于 DC1394(IEEE 1394 數(shù)碼相機(jī)規(guī)范)屬性的一個(gè)完整列表。

· static int VideoWriter::fourcc(char c1,char c2,char c3,char c4):這個(gè)函數(shù)把四個(gè)字符連接起來形成一個(gè) fourcc 碼。在示例中,MSVC 代表微軟視頻(僅在 Windows 上可用)。

· bool VideoWriter::isOpened():如果寫入視頻的對(duì)象被成功初始化,這個(gè)函數(shù)返回 true。例如,使用一個(gè)不正確的編解碼器會(huì)產(chǎn)生一個(gè)錯(cuò)誤。

· VideoCapture&VideoCapture::operator>>(Mat&image):這個(gè)函數(shù)抓取、解碼并返回下一幀。這個(gè)方法和布爾函數(shù)VideoCapture::read(OutputArray image)等價(jià)。可以使用這個(gè)函數(shù)而不使用函數(shù)VideoCapture::grab(),然后使用VideoCapture::retrieve()。

· VideoWriter&VideoWriter::operator<<(const Mat&image):這個(gè)函數(shù)寫入下一幀。這個(gè)方法和布爾函數(shù)VideoWriter::write(const
Mat&image)等價(jià)。在本示例中,有一個(gè)讀取/寫入循環(huán),可同時(shí)地獲取并處理窗口事件。waitKey(1000/fps)函數(shù)調(diào)用負(fù)責(zé)執(zhí)行這個(gè)任務(wù)。在這個(gè)示例中,1000/fps 表示返回外部循環(huán)之前等待的毫秒數(shù)。盡管不精確,但對(duì)于錄制的視頻仍能獲取每秒幀數(shù)的一個(gè)近似度量。

· void VideoCapture::release():這個(gè)函數(shù)釋放視頻文件或采集設(shè)備。盡管在本示例中沒有必要顯式地包含,但為了說明它的使用,示例中仍包含了這個(gè)函數(shù)。

總結(jié)

以上是生活随笔為你收集整理的OpenCV读写视频文件解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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