OpenCV C++学习笔记(3): 视频读写

有坑

VideoWriter::fourcc('m', 'p', '4', 'v')

视频读取

从文件取得视频和从摄像头取得视频是一样的, 先新建一个VideoCapture cap;

VideoCapture 的初始化可以直接 VideoCapture Cap(文件名或者摄像头ID) 也可以用cap.open(文件名)来定义.

一旦初始化好VideoCapture, 就可以使用get来获取各种视频的信息. 这里有列出超多.

例如:

float width = cap.get(CAP_PROP_FRAME_WIDTH)
float height = cap.get(CAP_PROP_FRAME_HEIGHT)

当然, 反过来也可以set, 主要是用在摄像头读取上的.

capA.set(
    CAP_PROP_FOURCC, 
    VideoWriter::fourcc('M', 'J', 'P', 'G'));
capA.set(CAP_PROP_FPS, 30);
capA.set(CAP_PROP_FRAME_WIDTH,frame_width);
capA.set(CAP_PROP_FRAME_HEIGHT,frame_height);

据说在读取摄像头时fourcc使用'M', 'J', 'P', 'G'能够达到很高的读取速度.

在读取视频时, 一般是要建立一个循环

Mat frame;
while(true){
    bool bSuccess = cap.read(frame); 
    if (bSuccess == false){
         cout << "Found the end of the video" << endl;
         break;
        }
}
cap.release();

视频写入

此处有坑!!!

VideoWriter oVideoWriter(
    output_filename, 
    VideoWriter::fourcc('m', 'p', '4', 'v'),
    fps, Size(width,height), true);    

这个fourcc是个非常诡异的东西, 用4个字母缩写来表示视频文件存储时使用的编码, 要想安心使用mp4文件格式, 目前测试的结果只能是用小写的mp4v的4个字符, 别的都没搞定.

在写入视频时, 通常是在读取视频的基础上进行处理后再保存, 一帧一帧写入就可以. 比如

Mat frame;
while(true){
    bool bSuccess = cap.read(frame); 
    if (bSuccess == false){
         cout << "Found the end of the video" << endl;
         break;
        }
    oVideoWriter.write(frame);
}
cap.release();
oVideoWriter.release();

记得最后要release()