zoukankan      html  css  js  c++  java
  • 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。如果出了这个问题,注意检查输入和输出的视频是否分辨率一致,以及颜色一致。还有一种情况,就是写入的帧是局部变量还是全局变量,这个具体原因还有待考证....

  • 相关阅读:
    GYM 101572C(模拟)
    GYM 101572A(单调队列优化dp)
    Codeforces 183C(有向图上的环长度)
    Codeforces 183A(坐标系性质)
    2019湘潭校赛 G(并查集)
    2019湘潭校赛 H(dp)
    2019湘潭校赛 E(答案区间维护)
    Codeforces 1141F2(贪心、预处理)
    Codeforces Round #411(Div. 2)——ABCDEF
    基数排序学习
  • 原文地址:https://www.cnblogs.com/lustar/p/8485324.html
Copyright © 2011-2022 走看看