在文章 YOLOv3 + Matlab Robotics ToolBox 實戰 -- 軟包裝藥品的機器人分揀系統設計與仿真 最後的展示視訊 軟包裝藥品的機器人分揀系統設計與仿真中,使用到了将一組JPG格式的圖檔轉換為MP4格式的視訊,解決了Matlab中相鄰連續Figure之前動畫擦除失敗的問題,覺得還比較有意思,是以記錄下來。下面是詳細介紹:
一、背景介紹
在前文提到的文章内容中,對于藥品的轉移過程,我想要達到的效果是藥品随着末端執行器同步轉移,雖然Matlab Robotics ToolBox中以關節角作為參數利用plot可以繪制動态的關節移動效果,但是當引入藥品之後,由于藥品是一個由六個獨立平面組成的六面體,繪制需要利用到 hold on 這一語句,是以繪制出來的結果就是整個空間全是藥品移動留下的軌迹,這樣是不好的,是以我将每一個關節動作對應的Figure畫面狀态進行拆分,并将該畫面儲存為單幀圖檔,最後再将所有圖檔進行拼接進而制作出一個完美的動畫。
二、開發平台
開發平台:MATLAB
三、制作過程
3.1、儲存Figure
利用for循環,将每一幀圖像繪制出來但是不顯示,直接按序編号儲存在檔案夾中:
savepath = 'D:\image\';%儲存路徑
for count = 1:100
h = figure;%将figure儲存在h中
set(h,'Visible','off');%将figure設為不顯示,防止一直彈框
saveas(h,[savepath num2str(imgcount)],'jpg');
%...
plot(...)%省略号寫你想要畫的圖,比如v-t、s-t 圖像之類的
%...
clf;
end
3.2、讀取圖檔
假設檔案夾中已經儲存了這樣一組連續編号的若幹張圖檔:
在matlab中,我們可以通過下面的程式讀取一張圖檔:
inputpath = 'D:\image\1.jpg';%圖檔輸入路徑
frame = imread(inputpath); % 讀取圖檔,放在變量frame中
但是我們我們需要的是讀取很多張圖檔來合成視訊欸,那該怎麼辦呢?是以我們需要稍微潤色一下,得到下面的程式:
inputpath = 'D:\image\';%圖檔輸入路徑
format = '.jpg';%圖檔格式
pic=dir(inputpath,'*.jpg');% 傳回路徑内容:檔案名
for i=1:(length(pic))
frame = imread(strcat(inputpath, num2str(i), format)); % 讀取圖檔,放在變量frame中
%...這裡是你想要對每張圖檔的操作,比如反色、二值化之類的
end
上面的程式首先将圖檔路徑拆分為輸入檔案夾路徑inputpath和圖檔格式format,這樣在for循環中再利用strcat對這兩者再加上序号變量進行拼接得到完整的圖檔路徑,再利用imread讀取即可循環讀入圖檔。而有的時候懶得去更改for循環的循環上限,是以利用 length(pic) 可以獲得檔案夾中的檔案數目。
3.3、制作視訊
在實作多幅圖檔導入之後,我們可以在for循環中執行制作視訊的操作。Matlab中提供了這樣一個函數:writeVideo,可以點選檢視定義。我們對3.2節的程式稍作修改如下:
inputpath = 'D:\image\';%圖檔輸入路徑
format = '.jpg';%圖檔格式
pic=dir(inputpath,'*.jpg');% 傳回路徑内容:檔案名
WriterObj = VideoWriter('D:\movie\temp0.avi'); %合成視訊目标檔案路徑
WriterObj.FrameRate = 10;%調整幀率,這個可以調整視訊長短
for i=1:(length(pic))
frame = imread(strcat(inputpath, num2str(i), format)); % 讀取圖檔,放在變量
writeVideo(WriterObj, frame);% frame存到變量WriteObj中
%...這裡是你想要對每張圖檔的操作,比如反色、二值化之類的
end
close(WriterObj);%關閉視訊
通過這樣的方法,我們便把讀入的一系列圖檔合成為一個連續的視訊,通過調整幀率我們還可以調整視訊的時長,不過有一點不友善的是這個函數儲存的視訊格式為AVI格式,若是需要MP4格式的話,這裡我使用的是格式工廠,雖然轉了一手,但是也不是很麻煩。最後再放一下視訊連結: 軟包裝藥品的機器人分揀系統設計與仿真 。
四、更多
除了上面我記錄的方法外,在全國大學生智能車競賽老大 -- 清華大學卓晴老師經營的公衆号 TsinghuaJoking 的 如何在推文裡讓你的曲線動起來? 一文中給出了使用matplotlib以及軟體movgear制作出了GIF類型的動圖,也挺有意思的,也可以學習一下^ v ^