• OpenCV -- VideoWriter


    一、简介

    在试验中需要常常将实验结果进行保存,在opencv中提供很好用的录制视频的句柄,也可称之为类videowriter。

    videowriter应用那是相当的筒单,总之分为三步:

    VideoWriter writer;
    
    writer.open("C:\Users\lenovo\Documents\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
            rate, //不进行跟踪,定位,只显示、录制时的帧率
            Size(inFrame.cols,inFrame.rows),
            true);
        if (!writer.isOpened())
        {
            return;
        }
    
    writer<<inFrame;
    writer.release();

    open函数:

    open(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);

    open函数目的是实现视频的存储

    • 第一个参数表示读取的视频帧所存放的新的文件
    • 第二个参数指的是视频存放的编码格式
    • fps表示每秒的帧数
    • size表示图像的长宽大小

    二、应用难点

    应用中出现的问题归结为:打不开、保存文件为空、保存的文件打不开

    1.打不开

    a、输入路径名称不对

    在程序中经常遇到打不开的问题,最常见的问题是路径输入不对,比如:

    strvideoFile = "C:UserslenovoDocumentsvisual studio 2010TestMyClassTestopencv3.avi

    上述代码中赋值操作,因为转义符的原因读入内存中,路径就会出现问题,结果为:

    C:UserslenovoDocumentsisual studio 2010TestMyClassTestopencv.avi

    当然打不开了,所以在程序中一定注意转义符的问题。

    正确的路径命名方式为:

    strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi";
    strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";
    

    b、编码格式不对

    在open函数中第二个参数是编码格式,一定按照提供的编码格式进行填写,在应用中最好的解决方法是为-1。当为-1时,程序对弹出如下对话框供你选择

     这样就没有问题啦,很容易解决编码问题。

    2.保存文件为空

    这种问题往往是后缀名不对,自己试过.Mp4没有成功,后来改为.avi就成功了

    3.保存文件打不开

    其实注意上面两个问题,就可以进行录制视频了,在录制视频无法打开打开问题,这个就不好排查了。

    但可以讲一下自己遇到的问题:

    最常见的问题是帧率设置不对,帧大小不对。

    三、实例代码

    string strimgfile,strvideoFile ;
        /*strimgfile = "C:UserslenovoDocumentsvisual studio 2010TestMyClassTestopencv12.png";
        strvideoFile = "C:UserslenovoDocumentsvisual studio 2010TestMyClassTestopencv3.avi";*/
        strimgfile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/12.png";
        strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi";
        //strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";
        
        Mat frame = imread(strimgfile);
        namedWindow("图像");
        imshow("图像",frame);
        namedWindow("视频");
        VideoCapture capture;
        VideoWriter writer;
        capture.open(strvideoFile);
        Mat inFrame;
        
        if (!capture.isOpened())
        {
            return;
        }
        int rate = capture.get(CV_CAP_PROP_FPS);
        int delay = 1000/rate;
        capture>>inFrame;
        writer.open("C:\Users\lenovo\Documents\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
            rate, //不进行跟踪,定位,只显示、录制时的帧率
            Size(inFrame.cols,inFrame.rows),
            true);
        if (!writer.isOpened())
        {
            return;
        }
        while(true)
        {
            capture>>inFrame;
            writer<<inFrame;
            imshow("视频",inFrame);
            waitKey(delay);
            if (!capture.grab())
            {
                break;
            }
        }
        writer.release();
        system("pause");

    https://blog.csdn.net/qq_30011277/article/details/109219684

  • 相关阅读:
    如何在Ubuntu上安装Wine 2.6
    51nod 1012 最小公倍数LCM
    二次urldecode注入
    CTF中的变量覆盖问题
    redis的bind误区
    宽字节注入原理
    PHP靶场-bWAPP环境搭建
    xxe-lab学习
    PHP代码审计之create_function()函数
    SSRF打认证的redis
  • 原文地址:https://www.cnblogs.com/zzzsj/p/14572388.html
Copyright © 2020-2023  润新知