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、输入路径名称不对

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

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

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

1
C:UserslenovoDocumentsisual studio 2010TestMyClassTestopencv.avi

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

正确的路径命名方式为:

1
2
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:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\12.png";
    strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.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

posted @   手磨咖啡  阅读(376)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示