前言:这次分享是在数字图像处理课程中学到的简单视频处理,具体包括:读取视频文件,显示并逐帧保存;将图像文件转化成视频文件;合并两份视频文件。
1.读取视频文件,显示并逐帧保存
1.1源代码
源代码中提供了两种读取视频文件的格式。
%(1)读取avi视频文件,并逐帧显示后逐帧保存
% video = VideoReader('C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\cba.avi');
% numframe = video.NumberOfFrames;%帧的总数
% for i = 1:numframe
% frame = read(video,i);%读取第i帧
% imshow(frame);%逐帧显示
% imwrite(frame,strcat('C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\cba图像逐帧存储\',num2str(i),'.jpg'),'jpg');
% end
%(2)这是另外一种格式读取,存储视频文件
file_path = 'C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\';
obj1 = VideoReader(strcat(file_path,'abc','.avi')); %读入视频abc
obj1_numFrames = obj1.NumberOfFrames; % 视频abc帧的总数
for k = 1:obj1_numFrames
frame = read(obj1,k); %读取第k帧
imshow(frame); %显示第k帧
store_path = strcat(file_path,'abc图像逐帧存储\',num2str(k),'.jpg'); % 第k帧图片的地址
imwrite(frame,store_path); % 保存帧
end
1.2VideoReader对象的属性介绍
Properties:
% Name - Name of the file to be read.
% Path - Path of the file to be read.
% Duration - Total length of file in seconds.
% CurrentTime - Location from the start of the file of the current
% frame to be read in seconds.
% Tag - Generic string for the user to set.
% UserData - Generic field for any user-defined data.
%
% Height - Height of the video frame in pixels.
% Width - Width of the video frame in pixels.
% BitsPerPixel - Bits per pixel of the video data.
% VideoFormat - Video format as it is represented in MATLAB.
% FrameRate - Frame rate of the video in frames per second.
%
1.3原视频文件
原视频文件链接:https://v.qq.com/x/page/r3203ex4w7o.html
1.4运行结果部分截图
图示1:逐帧保存后的文件夹
图示2:逐帧保存的部分图像文件
2.将图像文件转化成视频文件
Matlab中将图像文件转化成一个视频文件,要注意原图像文件夹中的图像要保持所有图像的像素值一致,否则Matlab就会以文件夹中的第一个图像的像素作为转化后视频文件的默认帧像素值,并以此选择图像文件夹中的图像加入到视频文件中。
2.1源代码
主文件代码:
%注意文件夹中的图像像素必须都相同,即writeVideo函数以第一张图像的像素作为最终动画的帧像素
%例如文件夹中第一张图像像素是1440 * 1080,那么可以利用“画图”重新调整图像像素
ImagePath = 'C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\海洋馆\';
VideoPath = 'C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\Aquarium.avi';
WriteImagesToAvi(ImagePath,VideoPath);
自定义函数文件代码:
%VideoWrite函数将根据profile 的设置来自动加上.avi,.mj2,.mp4 或者.m4v的扩展名,
% 如果没有设置profile的值,VideoWrite函数默认保存为.avi文件
function [] = WriteImagesToAvi(ImagPath,AviPath)
myobj = VideoWriter(AviPath); %初始化avi文件
myobj.FrameRate = 5;%VideoWriter(filename,profile),profile视频文件的属性
open(myobj);
[files] = dir(strcat(ImagPath,'*.jpg'));
numfiles = length(files);
for i = 1:numfiles%图像序列个数
fname = strcat(ImagPath,files(i).name);
frame = imread(fname);
writeVideo(myobj,frame);
end
close(myobj);
end
2.2转化后的视频文件
转化后的视频文件链接:https://v.qq.com/x/page/q3203hhbfmy.html
3.合并两份视频文件
将两份视频文件合并的整体思路就是以一份视频文件为母版,然后逐帧将另一份视频文件显示到第一份视频文件的适当位置。
3.1源代码
obj1 = VideoReader('C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\abc.avi');
framenum = obj1.NumberOfFrame();%总的帧数
obj2 = VideoReader('C:\Users\林露露\Desktop\数字图像处理\数字图像学习\简单视频处理\cba.avi');
for i = 1:framenum
frame1 = read(obj1,i);
frame2 = read(obj2,2);
ind = find(frame1 > 100);%找到图像frame1中像素值大于100的点,返回它的索引值(即它在矩阵中的次序,按列优先遍历)
[rows,cols,clrs] = ind2sub(size(frame1),ind);%将其索引值转化为
rowsNew = rows + 200;
colsNew = cols + 300;
indNew = sub2ind(size(frame2),rowsNew,colsNew,clrs);
frame2(indNew) = frame1(ind);
imshow(frame2);%显示帧图像
end
3.2视频文件
第一份视频文件链接:https://v.qq.com/x/page/r3203ex4w7o.html
第二份视频文件链接:https://v.qq.com/x/page/q3203hhbfmy.html
4.总结
从这次基于Matlab简单图像的处理中,我感觉最大的收获莫过于了解并初步掌握了将一份图像文件转化成视频文件了,这提供了我一种将生活中的照片合成一份视频的方法,还是蛮有趣的。由于作者涉足此领域尚浅,文章中若有错误,不足,还请不吝赐教,非常感谢!