利用matlab將視訊分幀成圖片或將圖片轉成視訊
阿新 • • 發佈:2019-01-06
前幾日因為寫論文有需要,我必須從視訊裡面提取圖片。n年前,小編當時還是一名小菜之時(雖然現在也還是菜鳥一個),那時總是要到處找一些軟體來實現分幀,但是現在視訊太大了,軟體不能夠一下全部將視訊圖片轉換,而且轉換完所需記憶體太大。加上小編這人總是喜歡玩得high點,因此我就想能不能使用程式讀取一幀,儲存一幀,然後清空呢,再迴圈下去。
答案當然是可以的。平常對影象處理用的多的軟體就是matlab了,今天小編就來和大家講講如何利用matllab 對視訊進行分幀,以後大家對視訊進行分幀或者將一張張圖片整成視訊就可以直接copy使用了
廢話就不多嘮了,來吧,程式走起
每個朋友它的需求總是不一樣的,我還是把單純的視訊分幀程式也給掛出來吧
clc,clear;
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
下面是時候展現真正的技術了,讀取一張扔一張
clc;
clear;
%% 讀取視訊
video_file='***.avi'; //這裡可以使用昨天小編教大家使用OPENCV自拍的視訊為例哦
video=VideoReader(video_file);
frame_number=floor(video.Duration * video.FrameRate); // 獲取幀數,為下面迴圈準備
% % 分離圖片
for i=1:frame_number
image_name=strcat('****\', num2str(i));
image_name=strcat(image_name,'.jpg');
I=read(video,i); %讀出圖片
imwrite(I,image_name,'jpg'); %寫圖片
I=[];
end
又有人問到,小編,乾脆也講下如何將一幀幀圖片合成視訊吧。還有人問,小編,怎麼把視訊剪輯一下啊?
好吧,小編在再大家嘮嘮吧,誰讓小編話多呢?程式走起。。。等等,小編,我是學文科的怎麼辦? 。。。。。,學文科的?開什麼玩笑啊哥,取用愛剪輯吧,那個更適合你。
framesPath = 'F:\最新的fish1\'; %影象序列所在路徑,同時要保證影象大小相同 ,如果不同,可用 resize()
videoName = 'Bolt.avi'; %表示將要建立的視訊檔案的名字
fps = 30; %幀率
startFrame = 1; %從哪一幀開始 (玩愛剪輯的IT朋友,好好看)
endFrame = 350; %哪一幀結束
if(exist('videoName','file'))
delete videoName.avi // 判斷下是否存在視訊,小編個人習慣
end
%生成視訊的引數設定
aviobj=VideoWriter(videoName); %建立一個avi視訊檔案物件,開始時其為空
aviobj.FrameRate=fps;
open(aviobj); %開啟檔案寫入視訊資料
%讀入圖片
for i=startFrame : endFrame // for迴圈,從哪一幀到哪一幀
fileName=sprintf('%04d',i); %根據檔名而定 我這裡檔名是0001.jpg 0002.jpg ....
frames=imread([framesPath,fileName,'.jpg']);
writeVideo(aviobj,frames);
end
close(aviobj); % 關閉建立視訊,養成良好習慣,別吵著別人
小編也是剛剛接觸matlab 幾個月,MATLAB中有豐富的圖形處理能力,提供了繪製各種圖形、影象資料的函式。他提供了一組繪製二維和三維曲線的函式,他們還可以對圖形進行旋轉、縮放等操作。內部還包含豐富的數學函式和資料型別,使用方便且功能非常強大。通過對MATLAB的系統環境,資料的各種運算,矩陣的分析和處理,程式設計,繪圖,數值計算及符號運算的學習,使我在短時間內學會使用MATLAB的基本函式,同時,我們可以自己根據例題編寫設計簡單的程式來實現不同的功能,繪製出比較滿意的二維三維圖形,在實踐中找到樂趣。