【OpenCV】视频文件与图片序列的相互转换(简洁易懂)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongtao_6/article/details/82595199

经常遇到一些视频需要拆分成图像序列进行处理,再把图像序列组合成视频。下面介绍一下图片序列和视频文件的相互转换问题。直接上代码,注释的很详细了
测试环境为VS2015+Opencv340

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    char fileName[200];
    Mat frame;
/*---------------------------------------------------
------------视频转换为图像序列-----------------------
---------------------------------------------------*/
    VideoCapture cap;
    cap.open("D:\\video\\180910.mp4");  //视频路径
    if (!cap.isOpened())    return -1;  //读取视频失败
    int i=0;
    while (true)
    {
        cap >> frame;                   //获取一帧
        if (frame.empty())  break;      //帧为空时跳出
        sprintf(fileName, "D:\\video\\1 (%d).jpg", ++i);//保存图片的路径及名称
        imwrite(fileName, frame);       //保存为图片
        cout << "picture:" << i << endl;
        imshow("Video", frame);
        int key = waitKey(33);
        if (char(key) == 27)    break;  //按esc键中断输出
    }
    cap.release();                      //释放资源
/*---------------------------------------------------
------------图像序列转换为视频-----------------------
---------------------------------------------------*/
    Mat text = imread("D:\\video\\1 (1).jpg");//获取第一张图片,为方便设置视频的单帧分辨率
    VideoWriter writer;
    writer.open(
        "my_video.mp4",                 //输出文件名
        CV_FOURCC('M', 'P', 'E', 'G'),  //编码格式 MPEG-4
        25.0,                           //帧率(FPS),double型
        Size(text.cols, text.rows),     //单帧分辨率
        true                            //只输入彩色图
    );
    i = 0;
    while (true)
    {
        sprintf(fileName, "D:\\video\\1 (%d).jpg", ++i);
        frame = imread(fileName);       //读取一张图片
        if (frame.empty())  break;
        writer << frame;                //将图片写入视频
        cout << "frame:" << i << endl;
    }
    i = 0;
    writer.release();                   //释放资源
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/hongtao_6/article/details/82595199
今日推荐