美文网首页Opencv3基础学习
【opencv八】利用opencv加快视频播放速度,并保存avi

【opencv八】利用opencv加快视频播放速度,并保存avi

作者: yuanCruise | 来源:发表于2018-12-16 11:29 被阅读104次

在许多应用的需求中,希望将输入,或捕获图像记录到输出视频流中,并保存成一个完整的视频,OpenCV提供了一种简单的方法。正如【opencv四】利用opencv读取显示视频【opencv七】利用opencv调用电脑摄像头中用到的可以从视频流中捕获到一个一个的帧,并将这些帧逐一显示。我们也可以创建一个写入功能,使得这一个个的帧能够逐一被放入到视频中。在opencv中cv::VideoWriter类就可以实现这个功能。

下面程序段的功能为:调整输入视频的播放速度,并将新速度的视频保存为.avi文件。主要操纵的就是一个参数:帧率(fps)。

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;

int main()
{
    String out_path = "H:\\vs2017\\opencv_learning\\ConsoleApplication1\\out1.avi";
    namedWindow("Example6", WINDOW_AUTOSIZE);
    namedWindow("Log_Polar", WINDOW_AUTOSIZE);

    VideoCapture cap;
    cap.open("H:\\vs2017\\opencv_learning\\ConsoleApplication1\\video1.mp4");

    double fps = cap.get(CAP_PROP_FPS)*2;
    Size size((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT));

    VideoWriter writer;
    writer.open(out_path, CV_FOURCC('M', 'J', 'P', 'G'), fps, size, isColor=true);

    Mat gry_frame, bgr_frame,cny_frame;
    while (1)
    {
        cap >> bgr_frame;
        if (bgr_frame.empty()) break;
        imshow("Example6",bgr_frame);

    
        imshow("Log_Polar", bgr_frame);
        writer << bgr_frame;


        //按Esc键退出while
        char c = waitKey(10);
        if (c == 27) break;

    }
    cap.release();

    //getchar();
    return 0;

}

上述代码中主要的操作就是对cv::VideoWriter这个类实例化出来的writer对象的操作。

writer.open(out_path, CV_FOURCC('M', 'J', 'P', 'G'), fps, size);

该函数有以下几个参数:

  • out_path: 该参数是写入视频后,保存avi文件的路径+文件名
  • CV_FOURCC('M', 'J', 'P', 'G'):确定输出视频的编码规则。

四个字符用来表示压缩帧的codec 例如:
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
NOTE:生成文件占用空间最小的编码方式是MPEG-4.2 codec。在VideoWriter类的构造函数参数为CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,对应在VideoWriter类的构造函数参数为CV_FOURCC('P','I','M','1') ,所占磁盘空间是前者的5.7倍。所以如果需要24小时全天候录制监控,可以优先使用MPEG-4.2的编解码方式。
若编码器代号为 -1,则运行时会弹出一个编码器选择框.


  • fps:该参数表示输出视频的帧率,本例子中就是将帧率改成了原始视频的两倍,实现倍速播放。
  • size:该参数指定了输出视频每帧图像的大小,本例子中该值来自于原始视频帧的大小。
  • isColor:如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。

如下面两幅图所示,上方的为输入视频,下方为通过处理后的avi视频。可以看到相同的视频,下方只有5s钟的时间,原因是进行了倍速处理。倍速的速度可以自行调节。

输入视频 输出视频

本人csdn博客地址:https://blog.csdn.net/qiu931110/
本人微信公众号:yuanCruise

相关文章

网友评论

    本文标题:【opencv八】利用opencv加快视频播放速度,并保存avi

    本文链接:https://www.haomeiwen.com/subject/kqgzhqtx.html