1. 程式人生 > >【OpenCV3】視訊讀寫cv::VideoCapture和cv::VideoWriter

【OpenCV3】視訊讀寫cv::VideoCapture和cv::VideoWriter

OpenCV3和OpenCV2類似,視訊的讀、寫操作,分別通過cv::VideoCapture和cv::VideoWriter兩個類來實現。

1、視訊的讀取操作cv::VideoCapture

cv::VideoCapture既支援視訊檔案的讀取,也支援從攝像機中視訊的讀取。cv::VideoCapture物件的建立方式有以下三種:

[cpp] view plain copy  print?
  1. cv::VideoCapture capture(  
  2. const string& filename, // 輸入檔名
  3. );  
  4. cv::VideoCapture capture(  
  5. int device // 視訊捕捉裝置 id
  6. );  
  7. cv::VideoCapture capture();  
第一種方式是從檔案(.MPG或.AVI格式)中讀取視訊,物件建立以後,OpenCV將會開啟檔案並做好準備讀取它,如果開啟成功,我們將可以開始讀取視訊的幀,並且cv::VideoCapture的成員函式isOpened()將會返回true(建議在開啟視訊或攝像頭時都使用該成員函式判斷是否開啟成功)。

第二種方式是從攝像機中讀取視訊,這種情況下,我們會給出一個識別符號,用於表示我們想要訪問的攝像機,及其與作業系統的握手方式。對於攝像機而言,這個標誌符就是一個標誌數字——如果只有1個攝像機,那麼就是0,如果系統中有多個攝像機,那麼只要將其向上增加即可。識別符號另外一部分是攝像機域(camera domain),用於表示攝像機的型別,這個域值可以是下面任一預定義常量。


以這種方式建立視訊捕獲物件時,我們所傳遞的識別符號是域索引和攝像機索引的和。例如:

[cpp] view plain copy  print?
  1. cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);  

這個例子中cv::VideoCapture將嘗試開啟第2個(編號從0開始)1394攝像機。多數情況下,由於我們只有一個攝像機,因此沒必要指定攝像機的域,此時使用cv::CAP_ANY是一種高效的方式(也即是0,所以不用特意指定)。

第三種方式僅僅建立一個捕獲物件,而不提供任何關於開啟的資訊。建立以後通過成員函式open()來設定開啟的資訊。open()操作也有以上兩種方式。

[cpp] view plain copy  print?
  1. cv::VideoCapture cap;  
  2. cap.open( "my_video.avi" );  

將視訊幀讀取到cv::Mat矩陣中,有兩種方式:一種是read()操作;另一種是 “>>”操作。 [cpp] view plain copy  print?
  1. cv::Mat frame;  
  2. cap.read(frame); //讀取方式一
  3. cap >> frame; //讀取方式二

下面是讀取視訊並顯示的示例程式碼:
[cpp] view plain copy  print?
  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. void video_capture_test()  
  4. {  
  5.     cv::VideoCapture capture("test.mp4");  
  6.     if (!capture.isOpened())  
  7.     {  
  8.         std::cout << "Read video Failed !" << std::endl;  
  9.         return;  
  10.     }  
  11.     cv::Mat frame;  
  12.     cv::namedWindow("video test");  
  13.     int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);  
  14.     std::cout << "total frame number is: " << frame_num << std::endl;  
  15.     for (int i = 0; i < frame_num - 1; ++i)  
  16.     {  
  17.         capture >> frame;  
  18.         //capture.read(frame); 第二種方式
  19.         imshow("video test", frame);  
  20.         if (cv::waitKey(30) == 'q')  
  21.         {  
  22.             break;  
  23.         }  
  24.     }  
  25.     cv::destroyWindow("video test");  
  26.     capture.release();  
  27.     return;  
  28. }  

上面的程式碼,我們使用了cv::VideoCapture的成員函式get()並設定標識cv::CAP_PROP_FRAME_COUNT獲取了讀取視訊的幀總數。同樣,我們可以指定其他標識,來獲取讀取視訊或攝像頭的其他屬性。另外,我們也可以使用成員函式set(),設定相應屬性的值。cv::VideoCapture中提供的屬性標識如下圖所示。


2、視訊的寫操作cv::VideoWriter

cv::VideoWriter物件的建立有兩種方式,第一種是使用建構函式的形式,第二種使用open()的方式,具體如下:

[cpp] view plain copy  print?
  1. cv::VideoWriter out(  
  2.     const string& filename, // 輸入檔名
  3.     int fourcc, // 編碼形式,使用 CV_FOURCC()巨集
  4.     double fps, // 輸出視訊幀率
  5.     cv::Size frame_size, // 單幀圖片的大小
  6.     bool is_color = true// 如果是false,可傳入灰度影象 
  7. );  
  8. cv::VideoWriter out;  
  9. out.open(  
  10.     "my_video.mpg"//輸出檔名
  11.     CV_FOURCC('D','I','V','X'), // MPEG-4 編碼
  12.     30.0, // 幀率 (FPS)
  13.     cv::Size( 640, 480 ), // 單幀圖片解析度為 640x480
  14.     true// 只輸入彩色圖
  15. );  

同樣,向建立後的cv::VideoWriter物件寫入影象也有兩種方式,即write()操作和“<<”操作: [cpp] view plain copy  print?
  1. cv::VideoWriter::write(  
  2.     const Mat& image // 寫入影象作為下一幀
  3. );  
  4. my_video_writer << my_frame;  

    //cv::VideoCapture capture(0); // 開啟攝像頭
    cv::VideoCapture capture(fName);// 開啟視訊fName 視訊路徑
    cv::Mat imageTemp;
    capture>>imageTemp;


    printf("Image size: [%d %d]\n", imageTemp.cols, imageTemp.rows);

    // 獲取視訊的總幀率數
    int allCount = (int)capture.get(CV_CAP_PROP_FRAME_COUNT);

    int countFram = 0;
    Timer mTimer;
    while(1)
    {
        capture>>imageTemp;
        cv::imshow("show", imageTemp);
        cv::waitKey(30);
        countFram ++;
        if(countFram == allCount - 2)
        {
            capture.release();
            break;
        }
    }

 使用opencv讀取視訊主要用到這幾個函式:cvCreateFileCapture  cvQueryFrame (或cvGrabFrame cvRetrieveFrame)  cvReleaseCapture。

1:簡單介紹:

CvCapture是一個結構體,用來儲存影象捕獲所需要的資訊,opencv提供了兩種方式從外部捕獲影象

         一種是從攝像頭中,另一種是通過解碼視訊得到影象

         兩種方式都必須從第一幀開始一幀一幀的按順序獲取,因此每獲取一幀後都要儲存相應的狀態和引數。比如從視訊檔案中獲取,需要儲存視訊檔案的檔名,相應的解碼器型別,下一次如果要獲取將需要解碼哪一幀等。這些資訊都儲存在CvCapture結構體中,每獲取一幀後,這些資訊都將被更新,獲取下一幀需要將新資訊傳給獲取的api介面

讀取攝像頭          只需將cvCreateFileCapture改為cvCreateCameraCapture即可。該函式的輸入引數是一個ID號,只有存在多個攝像頭時才起作用。當ID=-1時,表示隨機選擇一個。

2 程式碼:

[cpp] view plain copy print?
  1. #include <iostream>
  2. #include "cxcore.h"
  3. #include "cv.h"
  4. #include "highgui.h"
  5. usingnamespace std;  
  6. 相關推薦

    OpenCV3視訊cv::VideoCapturecv::VideoWriter

    OpenCV3和OpenCV2類似,視訊的讀、寫操作,分別通過cv::VideoCapture和cv::VideoWriter兩個類來實現。 1、視訊的讀取操作cv::VideoCapture cv::VideoCapture既支援視訊檔案的讀取,也支

    Linux磁碟 測試

    一、如何檢視當前磁碟的IO使用情況 使用命令:iotop Total DISK READ: 3.89 K/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO>

    OSSBucket許可權

    使用者建立的Bucket總共有三種許可權: /*私有 * 只允許自己讀寫操作,其他使用者沒有許可權 */ CannedAccessControlList acl_private = CannedAccessControlList.Private; /*公共讀寫

    QtQSettings登錄檔、配置檔案

    簡述 一般情況下,我們在開發軟體過程中,都會快取一些資訊到本地,可以使用輕量級資料庫sqlite,也可以操作登錄檔、讀寫配置檔案。 關於QSettings的使用前面已經介紹過了,比較詳細,見“更多參考”,下面介紹下QSettings常用功能-讀寫登錄檔、配置檔案。 簡述 優點 讀

    原創.NETExcel工具Spire.Xls使用(3)單元格控制

      前一篇文章:“.NET讀寫Excel工具Spire.Xls使用(2)Excel檔案的控制”給大家介紹了C#使用Spire.XLS來控制Excel檔案的基本功能和相關實踐程式碼。這篇文章將重點介紹C#操作Excel檔案時,對Excel單元格的控制。   以前在使用NPOI的時候,其實印象最深的還是

    原創.NETExcel工具Spire.Xls使用(1)入門介紹

      在.NET平臺,操作Excel檔案是一個非常常用的需求,目前比較常規的方法有以下幾種: 1.Office Com元件的方式:這個方式非常累人,微軟的東西總是這麼的複雜,使用起來可能非常不便,需要安裝Excel,對於伺服器,有時候還需要為配置IIS許可權。折騰人,看到很多人在群裡面使用這個東西,出現各種抓

    原創.NETExcel工具Spire.Xls使用(2)Excel檔案的控制

      前一篇文章:“.NET操作Excel利器Spire.Xls使用(1)入門介紹 ”給大家介紹了Spire.XLS的基本功能和一些比較。這篇文章將重點介紹C#操作Excel檔案時,對Excel檔案本身的相關設定,全域性控制的內容。因為這也是C#讀寫Excel檔案時經常碰到的文章,也是我在使用過程中的一

    原創.NETExcel工具Spire.Xls使用(4)對資料操作與控制

      Spire.Office for .NET是E-iceblue開發的一種企業級.NET Office編輯的軟體集合,包括Spire.Doc,Spire XLS,Spire.PDF,Spire.BarCode等等。.NET平臺的開發人員可以使用Spire.Office for .NET輕鬆的操作含有

    原創.NETExcel工具Spire.Xls使用(5)重量級的Excel圖表功能

      前一篇文章:“.NET讀寫Excel工具Spire.Xls使用(4)對資料操作與控制”給大家介紹了Spire.XLS對資料的控制相關功能,這一篇給大家介紹Spire.XLS最大的亮點所在,C#控制Excel生成圖表。將介紹C#生成不同型別圖表的方法,並介紹Excel圖表的相關操作,如調整大小,儲存

    MFCVCini檔案

    可以用於載入時,讀取上一次的紀錄。 一:寫ini配置檔案: //獲取exe路徑 CString strPath; GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),M

    delphitxt檔案

    1. memo控制元件讀取txt memo1.Lines.LoadFromFile('E:/*/*.txt'); 2. Procedure NewTxt(FileName:String); Var F : Textfile; Begin if fileExists(Fil

    OpenCV3級聯分類器目標檢測——cv::CascadeClassifier簡介

    Cascade級聯分類器是一種快速簡單的分類方法,opencv2和opencv3中提供了完整的cascade分類器的訓練和檢測方法,本篇主要介紹下級聯分類器的檢測方法。 opencv中用於級聯分類的類

    轉載ReentrantReadWriteLock鎖的使用

    Lock比傳統執行緒模型中的synchronized方式更加面向物件,與生活中的鎖類似,鎖本身也應該是一個物件。兩個執行緒執行的程式碼片段要實現同步互斥的效果,它們必須用同一個Lock物件。   讀寫鎖:分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖與寫鎖互斥,這是由jvm自己控制的

    java 文件操作 生成隨機數,寫入txt,然後從txt中讀出

    進行 rac 直接 生成隨機數 catch trace buffered 代碼 tac 1.把生成的隨機數寫入到文件中 1 public static void WriterFun(){ 2 //獲得路徑 3 String filep

    python-inipythonini文件

    clas edr print 代碼 cells order sta read param 【python-ini】python讀寫ini文件 本文實例講述了Python讀寫ini文件的方法。分享給大家供大家參考。具體如下: 比如有一個文件update.ini,裏面有這些

    14華為HCIE-StorageCache鏡像&一高低水位&二盤&三策略&四機制

    HCIE storage hostman ------------------------------------重要說明------------------------------------以下部分內容來網絡,部分自華為存儲官方教材具體教材內容請移步華為存儲官網進行教材下載 網絡引用內容

    OpenCV3透視變換——cv::getPerspectiveTransform()與cv::warpPerspective()詳解

    透視變換(Perspective Transformation)是將成像投影到一個新的視平面(Viewing Plane),也稱作投影對映(Projective Mapping)。如圖1,通過透視變換ABC變換到A'B'C'。 圖1 透視變換示意圖

    OpenCV3影象通道分離與合併——cv::split()與cv::merge()詳解

    from: https://blog.csdn.net/guduruyu/article/details/70837779 在影象處理中,尤其是處理多通道影象時,有時需要對各個通道進行分離,分別處理;有時還需要對分離處理後的各個通道進行合併,重新合併成一個多通道的影象。opencv2和o

    python技巧實用篇python檔案、jieba自定義字典

    import jieba from astropy.table.np_utils import join import os import sys import jieba.posseg as p

    OpenCV3影象翻轉——cv::flip()詳解

    在opencv2和opencv中,cv::flip()支援影象的翻轉(上下翻轉、左右翻轉,以及同時均可)。 具體呼叫形式如下: void cv::flip( cv::InputArray sr