版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}