基于MATLAB对avi视频的处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:基于MATLAB对avi视频的处理——彩色视频变为黑白视频
姓名:
学号:
系别:电子信息工程
专业:电子科学与技术
2014年11月19日
基于MATLAB对avi视频的处理
——彩色视频变为黑白视频
一、实验要求:
1.完成一个简单的多媒体应用程序;
2.内容包含:多媒体信息的获取、处理、展现三个基本过程;
3.不能是打开一个视频文件播放,也不能用现成的插件完成,比如在程序中插入一个media player的插件完成;
二、实验内容:
1.实验素材:
在本次的对avi视频处理的过程中,原素材选取了“浙江卫视奔跑吧兄弟20141031期”,720P(1280×720),3.72GB,mkv格式,时长01:30:23,如图2.1所示:
图2.1
实验素材的预处理:
在实验中考虑到两点因素,需对原素材做预处理:1.原素材时长太长,一个多小时,分辨率太高,720P,数据量太大,对计算机
处理难度太高,需对视频进行截短和降低分辨率,故使用格式工厂先对视频进行处理,如图2.2所示;
图2.2
本次实验平台是Matlab2010b版本,其中早期的版本中,Matlab 中函数aviread对读取avi的视频比较苛刻,aviread支持无压缩格式的avi(zjmedia rgb24)和 'Cinepak'格式的avi文件和'Indeo5'压缩格式的avi,在Matlab2010b中的函数mmreader支持的格式更加广泛一些,但是仍然不是很全,故要使用WinA VI对视频格式进行转换,如图2.3所示,视频格式为avi(ZJMedia Uncompress RGB24)。
图2.3
最终视频素材,如图2.4所示:
图2.4
分辨率320×240, 3.74MB,格式avi(ZJMedia Uncompress RGB24),时长00:00:06,帧率25F/S;(注:其实第二步的winair 的处理不必去作,只需格式工厂截短就行,后续验证时作者发现Matlab对普通的avi也支持,若不支持,再做这一步)
2.实验过程:先将视频素材进行读取播放,以检验是否能在Matlab2010b环境下读取运行,再将视频转换成图片序列并转换成灰度图片进行存储,再用这些黑白图片进行avi文件的创建并播放黑白视频,流程图如图2.5所示:
图2.5
3.实验具体操作:在此部分简单列出三部分的内容,视频的播放,灰度图像的转换,创建avi文件;
a.视频的播放程序,如图2.6:
图2.6
b.灰度图像的转换,如图2.7:
图2.7 c.创建avi文件,如图2.8:
图2.8
三、程序代码:详见源代码及可执行文件
四、运行结果及分析:
1.视频素材的读取和播放,如图4.1:
图4.1
图 4.1显示了视频素材的读取和播放,格式为avi(ZJMedia Uncompress RGB24),时长为6s,帧率为25F/s。
2.灰度图像的获取,如图4.2:
图4.2
图4.2中所示,将视频转换成图片序列并转换成灰度图片进行存
储
3.黑白视频的播放,如图
4.3:
图4.3
图4.3中所示,黑白视频的创建已经成功并进行了播放。
五、总结
首先,这次是第一次对视频做处理,难度刚开始会感觉到有点难,也不知道该做怎样的处理,然后自己定了一个把彩色的转为黑白的吧,原以为会很好做,思路倒还是清楚,主要就是连续图片的灰度转换,但在做的时候困难很大,特别是这几点:1.对avi视频的预处理,否则Matlab平台不支持该格式;2.视频转换为图片序列并灰度化,进行存储,在存储过程中有不懂的地方,很多的函数看不懂,反复查;
3.还有avi视频的创建,因为是针对黑白图像的,资料中很多的针对彩色图像的程序大片地出错,很纠结。
所以,整整地算是两个下午吧,都在调程序,最后出来了,看到自己视频的播放时很高兴,以后在学习中还需努力学习,也要多谢老师把自己引入这样一门课,很有意义的一门课。
源程序:
clear all;
close all;
%播放程序
videoResult = mmreader('D:\Angelababy.avi');
nFramesResult = videoResult.NumberOfFrames; %帧数vidHeightResult = videoResult.Height; %320
vidWidthResult = videoResult.Width; %240
% Preallocate movie structure.
movResult(1:nFramesResult) = struct('cdata', zeros(vidHeightResult, vidWidthResult, 3, 'uint8'),'colormap', []);
for j = 1: nFramesResult
movResult(j).cdata = read(videoResult, j);
end
% Size a figure based on the video's width and height.
gf = figure(1);
set(gf, 'position', [320 240 vidWidthResult vidHeightResult])%设置窗口位置和根据图像大小设置窗口大小
% Play back the movie once at the video's frame rate.
movie(gf ,movResult, 1, videoResult.FrameRate);
close all;
%灰度图片的获取
for i=1: nFramesResult
strtemp=strcat('d:\F_gray\',int2str(i),'.','jpg'); %将每帧转成.jpg 的图片F = read(videoResult, i);
F_gray = rgb2gray(F);
imwrite(F_gray,strtemp,'JPG'); % 把图像写入磁盘
end
%创建avi文件
myObj = VideoWriter('newfile.avi');%初始化一个avi文件writerObj.FrameRate = 30;
open(myObj);
for i=1:149%图像序列个数
fname=strcat('d:\F_gray\',num2str(i),'.jpg');
frame = imread(fname);
writeVideo(myObj,frame);
end