天天看點

Matlab小技巧 -- 讓圖動起來!

    在文章 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小技巧 -- 讓圖動起來!

    在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 ^