OpenCV視頻的讀寫


實驗室的項目是處理視頻,所以就從視頻的讀取和寫入開始吧!

常用的接口有C++和Python,Python肯定要簡潔許多,不過因為項目需要,還是用C++了(PS:其實是我被Python的速度驚到了...)

cv::VideoCapture類

 

這個對象就是讀入視頻的了,完整的操作有很多,這里只提及最普遍的用法。具體可見:https://docs.opencv.org/3.1.0/d8/dfe/classcv_1_1VideoCapture.html

1、對象的構造函數,如下面的例子:

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

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

2、驗證視頻讀入是否成功,如下:

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

3、驗證完成后,就可以開始讀取視頻啦!

cv::Mat frame;
capture >> frame;

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

cv::VideoWriter類

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

構造函數 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差不多了,不過是輸出流的操作。

下面是一段完整的讀取視頻,進行處理並導出視頻:

#include <opencv2/opencv.hpp>
#include "highgui.h"
#include <string>
using namespace std;
using namespace cv;
int main()
{
    Mat frame;
    string filename = "D:\Camera Road 01.avi";
    VideoCapture cap(filename);
    VideoWriter out;
    out.open("D:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'),cap.get(CV_CAP_PROP_FPS),Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT)));
    if (!cap.isOpened())
    {
        cout << "Video load failed!" << endl;
        return -1;
    }
    while (1)
    {
        cap >> frame;
        if (frame.empty())
        {
            cout << "Video process finished!" << endl;
            return 0;
        }
        imshow("video", frame);
        if (waitKey(10) == 'q') break;
        out << frame;
    }
    cap.release();
    return 0;
}

Tip:

我遇到了一個問題,就是寫入的視頻經常是6KB。如果出了這個問題,注意檢查輸入和輸出的視頻是否分辨率一致,以及顏色一致。還有一種情況,就是寫入的幀是局部變量還是全局變量,這個具體原因還有待考證....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM