讲解如何利用OpenCV合成avi格式视频。
在处理图像和视频的过程中,通常会遇到将视频转换成图像处理,或者将处理完的图像合成原视频。在基于视频的处理过程中,通常都是先将视频转换为每一帧图像,然后基于图像去处理。OpenCV有很多关于Video2Image的相关算法代码。注意,视频转图像过程中,只要有OpenCV配置好了,正常条件下都可以转换成图像。不依赖其他库,不依赖第三方库。
将图像转合成视频的过程中,需要将图像保存在一个文件夹下,然后用OpenCV来的videowriter类来添加一帧一帧图像,最后合成avi视频。注意,OpenCV只能合成avi格式的视频。按照常规步骤,就合成了视频。但是,此时可以看到,视频文件是生成了,但是大小是0kb。算法不会报错,但是并没有生成视频。注意,这是缺少第三方库,如下图所示。没有任何信息。
以上是用OpenCV生成的视频。
从这里可以看出,没有任何信息。说明没有生成成功。
通过各种查找,需要将 opencv_ffmpeg247.dll 以及opencv_ffmpeg247_64.dll这两个dll文件放在工程目录下面,以及exe文档下面。如下图所示。 可以在这个链接下载这两个文件。自己改为支持版本的名字即可。比如opencv3.1.0就将dll改为opencv_ffmpeg310.dll。 opencv_ffmpeg247图像转视频库下载。基于OpenCV。
现在可以看到,生成的文件,具有大小,以及可以用了。但从最后结果看,虽然有具体大小的信息,但是在详细信息里面,并没有帧率,像素大小等信息,很多手机还看不了,只能借助播放器才能看,比如qq影音。
具体代码如下:
//创建一个写视频类,格式设定为MJPG,还有其他格式,自己可以改;
//注意,后缀只能是avi;帧率自己可以设置,设置为50fps,或者80。都可以自己修改。
//大小尽量和原始图像保持一致。
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
//创建一个写视频类,格式设定为MJPG,还有其他格式,自己可以改;
//注意,后缀只能是avi;
VideoWriter writer("E:\\high_speed_vision\\rereslut_50fps.avi", CV_FOURCC('M', 'J', 'P', 'G'), 50, Size(512,512),1);
//int i=0;
int count=0;
for (int i = 0; i <172; i++)
{
//读取原始图像;
Mat src=imread("E:\\high_speed_vision\\original\\"+to_string(i)+".png",1);
if(src.empty())
{
cout<<"null"<<endl;
}
resize(src,src,Size(512,512));
//将图像写入视频;
writer.write(src);
namedWindow("show image");
imshow("show image", src);
waitKey(10);
count++;
}
cout<<"count is:"<<count<<endl;
waitKey(0);
writer.release();
}
MATLAB合成视频
其实,为了可以方便的生成视频,也可以用MATLAB来做视频。 MATLAB写视频或许更方便,不需要第三方的依赖库。
我当时的视频在手机放不能看,虽然用OpenCV生成了视频,但是最后还是用MATLAB来合成了视频。代码如下:
clc; clear all;
%定义生成视频的名称和位置;
writerObj = VideoWriter('tracking_50fps.avi');
%设置帧率;
writerObj.FrameRate=50;
open(writerObj);
%图像存放地点;
pt = 'F:\video_generate\result_every\';
%循环遍历所有图像,写进去就是;
for k = 1:171
image = imread([pt,num2str(k),'.png']);
writeVideo(writerObj,image);
end
close(writerObj);
最后能看到详细信息如下: