1. 程式人生 > >matlab讀取/播放視訊的函式以及寫入/合成視訊函式

matlab讀取/播放視訊的函式以及寫入/合成視訊函式

1、可以用mmreader和 read這兩個函式讀取視訊幀
readerobj = mmreader('1.mpg');
vidFrames = read(readerobj);
具體引數含義幫助文件裡面有。示例:
fileName = '1.avi';% .avi必須是無失真壓縮的 obj = mmreader(fileName); vidFrames = read(obj);% 讀取所有的幀資料 numFrames = obj.NumberOfFrames;% 幀的總數  for k = 1 : numFrames %讀取資料  mov(k).cdata = vidFrames(:,:,:,k);
% mov(k)是一個結構體,mov(k).cdata實際上就是一個有RGB的幀
     mov(k).colormap = []; end movie(mov);% 在matlab中播放視訊 2、從AVI視訊中提取每一幀,使用 aviinfo,aviread str='1.avi'; info=aviinfo(str); fum=info.NumFrames; for i=1:fum     mov=aviread(str,i);     I=mov.cdata;     J=rgb2gray(I);     imwrite(J,strcat(int2str(i),'.bmp'),'bmp');
end 3、讀取視訊VideoReader類   (1) 一個讀取視訊,顯示幀,並儲存每一幀的程式碼 fileName = '1.avi';  obj = VideoReader(fileName); numFrames = obj.NumberOfFrames;% 幀的總數  for k = 1 : numFrames% 讀取資料      frame = read(obj,k);      imshow(frame);%顯示幀      imwrite(frame,strcat(num2str(k),'.jpg'),'jpg');% 儲存幀 end 下面具體介紹VideoReader類的函式。

(2)VideoReader - 該函式用於讀取視訊檔案物件。 函式呼叫格式: obj = VideoReader(filename) obj = VideoReader(filename,Name,Value)  其中obj為結構體,包括如下成員: Name - 視訊檔名 Path - 視訊檔案路徑 Duration - 視訊的總時長(秒) FrameRate - 視訊幀速(幀/秒) NumberOfFrames - 視訊的總幀數 Height - 視訊幀的高度 Width - 視訊幀的寬度 BitsPerPixel - 視訊幀每個畫素的資料長度(位元) VideoFormat - 視訊的型別, 如 'RGB24'. Tag - 視訊物件的識別符號,預設為空字串'' Type - 視訊物件的類名,預設為'VideoReader'. UserData - Generic field for data of any class that you want to add to the object.  Default: [] 如,視訊的總幀數為numFrames = obj.NumberOfFrames; 在不同的系統平臺下,可以讀取的視訊檔案型別如下: 所有系統平臺:AVI (.avi), Motion JPEG 2000 (.mj2) 所有Windows系統:MPEG-1 (.mpg), Windows Media Video (.wmv, .asf, .asx), 和任何Microsoft DirectShow支援的型別。 Windows 7系統:MPEG-4, 包括 H.264 編碼視訊 (.mp4, .m4v), Apple QuickTime Movie (.mov), 和任何Microsoft Media Foundation支援的型別。 Macintosh系統:MPEG-1 (.mpg), MPEG-4, 包括 H.264 編碼視訊 (.mp4, .m4v), Apple QuickTime Movie (.mov), 和任何在http://support.apple.com/kb/HT3775中列出的QuickTime支援的型別。 Linux系統:Any format supported by your installed plug-ins for GStreamer 0.10 or above, as listed on http://gstreamer.freedesktop.org/documentation/plugins.html, including Ogg Theora (.ogg). (3)該類其他成員函式: get - 獲取視訊物件的引數 引數的名字為上述obj物件的所有成員。 呼叫格式: Value = get(obj,Name) Values = get(obj,{Name1,...,NameN}) allValues = get(obj) get(obj) 如: xyloObj = VideoReader('xylophone.mpg'); xyloSize = get(xyloObj, {'Height', 'Width', 'NumberOfFrames'}) set - 設定視訊物件的引數,與get對應 呼叫格式: set(obj,Name,Value) set(obj,cellOfNames,cellOfValues) set(obj,structOfProperties) settableProperties = set(obj)  如: newValues.Tag = 'My Tag'; newValues.UserData = {'My User Data', pi, [1 2 3 4]}; xyloObj = VideoReader('xylophone.mpg'); set(xyloObj, newValues) 或 set(xyloObj, 'Tag', 'This is my tag.'); getFileFormats - 獲取在該系統平臺下,VideoReader可以支援讀取的視訊型別。 呼叫格式: formats = VideoReader.getFileFormats() isPlatformSupported - 檢測在當前系統平臺下VideoReader是否可用 呼叫格式: supported = VideoReader.isPlatformSupported() read - 讀取視訊幀 呼叫格式: video = read(obj),獲取該視訊物件的所有幀 video = read(obj,index),獲取該視訊物件的制定幀 如: video = read(obj, 1);         % first frame only 獲取第一幀 video = read(obj, [1 10]);    % first 10 frames 獲取前10幀 video = read(obj, Inf);       % last frame only 獲取最後一幀 video = read(obj, [50 Inf]);  % frame 50 thru end 獲取第50幀之後的幀 4、

寫入/合成視訊VideoWriter類

(1)一個簡單的利用影象序列合成視訊的示例程式碼。 myObj = VideoWriter('1.avi');%初始化一個avi檔案 writerObj.FrameRate = 30; open(myObj); for i=1:200%影象序列個數     fname=strcat('..\imgdata\',num2str(i),'.jpg');     frame = imread(fname);     writeVideo(myObj,frame); end  close(myObj); 下面具體介紹VideoWriter類的函式。 (2)VideoWriter - 該函式用於建立視訊寫入物件。 函式呼叫格式: writerObj = VideoWriter(filename)建立一個視訊寫入物件。當filename沒有副檔名時,預設為 . avi 檔案。 writerObj = VideoWriter(filename,profile)建立一個由profile指定型別的視訊寫入物件。 profile的可能值及其對應的視訊物件型別為: 'Archival' - Motion JPEG 2000 file with lossless compression,即. mj2 檔案。 'Motion JPEG AVI' - Compressed AVI file using Motion JPEG codec ,即. avi 檔案。 'Motion JPEG 2000' - Compressed Motion JPEG 2000 file,即. mj2 檔案。 'MPEG-4' - Compressed MPEG-4 file with H.264 encoding (Windows 7 systems only),即..mp4 或 .m4v 檔案。 'Uncompressed AVI' - Uncompressed AVI file with RGB24 video,即. avi 檔案。 預設是預設為'Motion JPEG AVI' ,即. avi 檔案。 (3)該類其他成員函式: open - 開啟視訊寫入物件 呼叫格式: open(writerObj) close - 關閉視訊寫入物件,與 open對應 呼叫格式: close(writerObj) 這兩個函式分別在寫入視訊物件前和寫入完成後使用。 getProfiles - 獲取在該系統平臺下,VideoWriter可以支援寫入的視訊型別。 呼叫格式: profiles = VideoWriter.getProfiles() writeVideo - 寫入視訊幀 呼叫格式: writeVideo(writerObj,frame)將一幀影象frame寫入視訊物件中 writeVideo(writerObj,mov)將matlab的movie物件寫入視訊中 writeVideo(writerObj,img)將一個影象寫入視訊物件中 writeVideo(writerObj,images)將一序列影象寫入視訊物件中 其中, frame可以通過 getframe獲得,如 frame = getframe; 。 mov是一個幀結構序列,每一個結構包括mov.cdata 和 mov.colormap。  5、平均法目標檢測 clear,clc;
%video = mmReader('C:\Users\Desktop\1.avi');
 video=VideoReader('C:\Users\Desktop\1.avi');

height = video.Height;
width = video.Width;
NumFrames = video.NumberOfFrames;
asd=VideoWriter('C:\Users\Desktop\avg.avi');  
asd.FrameRate=25;
open(asd);
video_dis = zeros(height,width);
subtract = zeros(height,width);
video_sum=zeros(height,width);
% video_avg=zeros(height,width);
for f = 1:NumFrames
    video_sum=video_sum+(double(rgb2gray(read(video,f))));
end
video_avg=video_sum./NumFrames;

for f = 1:NumFrames
    frame=read(video,f);
     for i = 1:height
        for j = 1:width
            subtract(i,j) = abs(frame(i,j)-video_avg(i,j));
        end
     end
     video_dis=double(im2bw(subtract,graythresh(subtract)));

  %   path='C:\Users\Desktop\';
   %  imwrite(video_dis,strcat(path,int2str(frameNum),'.jpg'));

 figure(1),subplot(1,1,1),imshow(video_dis,[]);title(sprintf('第%d幀視訊', f), 'FontWeight', 'Bold', 'Color', 'r');
 writeVideo(asd,video_dis);
end
close(asd);