在文章 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 ^
请发表评论