zoukankan      html  css  js  c++  java
  • OpenCV VideoWriter保存摄像头视频、本地视频等

    打开视频文件或摄像头视频需要使用Opencv中的VideoCapture类,保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter类。

    VideoWriter类的一个常用构造方式如下:

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

    其中fourcc代表了所使用的编码方式,如果输入-1,则会在运行时候弹出选择对话框,可以选择编码器:

    filename 输出视频文件名。
     fourcc为 四个字符用来表示压缩帧的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

    若编码器代号为 -1,则运行时会弹出一个编码器选择框.

    fps 被创建视频流的帧率。
    frame_size 保存视频的宽和高。
    isColor如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
    备注:

    生成文件占用空间最小的编码方式是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 #include <stdio.h>
     2 #include <opencv2/core/core.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 #include <opencv2/imgproc/imgproc.hpp>
     5  
     6 using namespace std;
     7 using namespace cv;
     8  
     9  
    10 int main()
    11 {
    12     VideoCapture cap(0);
    13  
    14     if (!cap.isOpened())
    15     {
    16         printf("open video failed!
    ");
    17         return 1;
    18     }
    19  
    20     Mat Frame;
    21  
    22     //设置保存的视频帧数目
    23     int frameNum = 100;
    24     //保存视频的路径
    25     string outputVideoPath = "..\test.avi";
    26     //获取当前摄像头的视频信息
    27     cv::Size sWH = cv::Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
    28         (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
    29     VideoWriter outputVideo;
    30     outputVideo.open(outputVideoPath, CV_FOURCC('M', 'P', '4', '2'), 25.0, sWH);
    31  
    32     while (cap.isOpened() && frameNum > 0)
    33     {
    34         cap >> Frame;
    35         if (Frame.empty()) break;
    36         outputVideo << Frame;
    37         frameNum--;
    38  
    39         imshow("img", Frame);
    40         waitKey(10);
    41  
    42         if (char(waitKey(1)) == 'q') break;
    43     }
    44  
    45     outputVideo.release();
    46     system("pause");
    47 }

    可能遇到的问题:

    1.打不开视频或摄像头
    ①.本地视频的输入路径有问题,例如下面所示:

     string outputVideoPath = "C:UsersTestTestopencv3.avi";

    上述方式会因为转义符而出现问题。

    正确的路径命名方式为:

    string outputVideoPath = "C:\Users\Test\Testopencv\3.avi";
    string outputVideoPath = "C:/Users/Test/Testopencv/3.avi";

    ②.摄像头前几帧出现空帧
    解决办法:多次加载视频,cap>>Frame直至图像不为空
    ③.编码格式不对
    在open函数中第二个参数是编码格式,一定按照提供的编码格式进行填写,在应用中最好的解决方法是为-1。

    2.保存文件为空

    可能是后缀名的问题,尝试使用.avi。

    3.保存文件打不开

    可能是帧率及图像宽高设置有误

  • 相关阅读:
    LeetCode Notes_#705_设计哈希集合
    LeetCode Notes_#706_设计哈希映射
    【问题记录】用坚果云同步小书匠数据库发生冲突
    Java设计模式5
    Java设计模式4
    Java设计模式3
    Java设计模式2
    Java设计模式1
    tiantian1412/NTU-HsuanTienLin-MachineLearning
    Jing--Li / book
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12965912.html
Copyright © 2011-2022 走看看