因为种种原因,好久没有更新头条文章了!今天继续探讨用Matlab 来识别视频中物体的运动轨迹!
上一篇关于识别物体运动轨迹的文章发出以后,很多人留言说"只是简单的通过对目标的灰度值设置阈值来识别目标物,这样的做法‘鲁棒性’太差,很容易导致错误识别和不识别的情况“。其中有些留言中提到了用差分法来做以上的处理效果会更好,今天我们就在Matlab中用差分法(通过两张图像相减)来对视频中运动的物体进行轨迹识别,这里还是用到上篇文章中的视频,下面的动图显示了视频中的一小段内容。
视频节选(出处见7月29号的文章)
我自己用差分法制作了一个简单GUI,今天在这里主要通过这个GUI来进行讲解,GUI界面如下,有导入视频、背景设置、ROI设置、各种参数设置、画轨迹图和热度图和数据保存。
GUI界面
一 视频的导入
点击’Load Video‘后导入想要分析的视频,这里我还是以上一篇文章中的视频为例进行演示。在导入视频后我们可以在界面上看到视频的一些简单信息,比如视频时长,视频名称和FPS (Frame per Second)。
视频信息
我们可以通过托动滑动条,在"Current Frame"里输入想要查看的帧数或者在”Current Time“里输入想看查看的时间,输入完成后回车,就能跳转到相应帧的画面。以上步骤实现的代码我上篇文章都有讲过,不清楚的可以查看我的上一篇文章或者私信我获取这个GUI的下载地址来查看代码。
指定帧
二 背景的提取
在视频中,运动的是小鼠以及上方屏幕中的黑点,而在我们要分析的视频中背景是没有发生任何变化的(本篇文章主要是针对这类视频进行运动物体的轨迹检测)。那么我们只需尽可能的提取不包含检测目标的背景,然后把要分析的帧和背景帧做差分,就能更好进行检测目标。例如我们要分析从左往右数第三只小鼠运动轨迹,我们通过改变显示的帧来查看,发现在900帧的时候图像中只有背景没有目标物体。
这个时候点击”Add Background“就把背景显示在了”Result“下面。
显示背景
接下来就是通过差分法提取检测目标啦,在此之前我们还需要选择检测目标的亮度是大于背景还是小于背景,不同的选择计算方式也不同,具体如下:
switch ob_c case 1 Frame_Subtract=;%检测物体比背景暗 case 2 Frame_Subtract=C_F-;%检测物体比背景亮 end这里小鼠是黑的,比背景要暗,是默认选项。
如果我们想要分析的视频中没有纯背景的帧怎么办呢?
在这种情况下,我们可以通过反复添加多张有检测目标的背景(在这些背景中目标物尽量不要重叠,当然也可以通过随机数来自动添加生成),然后把这些选取的背景帧做平均叠加,来降低检测目标对背景环境的影响。下图是我添加6张背景图后显示的总背景图。
多张背景图平均效果
可以看到右边背景图中目标物在背景中变”透明“啦,这样处理以后就降低了检测目标对背景环境的影响。这里主要通过imlincomb函数来实现这个功能。当觉得背景选的不好的时候也可以通过使用”Clear Background“来清空背景,然后重新添加。
三 选择要分析的区域
在做好背景提取后,接下来就是选择我们想要分析的区域进行物体的运动轨迹识别。
全图物体检测
在目前这个GUI里如果不添加要分析的区域的话,默认是分析视频的整个区域,通过调节灰度值阈值和目标面积阈值,在没有添加任何ROI(region of interest)的情况下,点击”Subtract Background“后得到的结果如下:
全图检测物体
图中红点为识别的物体质心。目前版本在没有选中ROI的情况下只能对只有一个物体的视频完成目标运动轨迹的追踪。
ROI内物体检测
很多时候我们需要分析某个区域内的物体运动轨迹,这个时候后我们首先通过点击”Select ROI“生成一个矩形框,拖动框框把我们想要分析的区域包含进去,然后点击”Add ROI“添加我们要分析的区域。目前版本是支持选区多个区域并同时分析区域内物体的运动轨迹。例如我们在这里分析第二只和第三只老鼠,我们按照上面提到的步骤来添加两个ROI,添加后如下图所示:
ROI选择
然后点击”Subtract Background“后弹出一个图像,显示当前帧识别后的结果:
ROI内识别结果
图像中显示了面积信息以及识别目标物的质心,随后我们通过调节灰度和面积阈值来达到更好的识别效果。上面那个图是灰度阈值15,面积阈值50。当我们参数改为把灰度阈值50,面积阈值50或者是灰度阈值20面积阈值300那么识别结果分别如下:
灰度阈值50,面积阈值50
灰度阈值20,面积阈值300
可以看出不同的参数设置对识别结果影响较大,开始可能要反复调试几次。这里我以灰度阈值20,面积阈值100为例来分析视频中选中区域两只老鼠的运动轨迹。
四 目标物体的轨迹追踪
轨迹追踪分析
以上参数都调节完毕后,剩下的就是设置我们要分析的开始时间和结束时间,系统默认是整个视频的时长。这里我以开始时间10秒,结束时间30秒为例进行演示操作。设置好时间后,点击”Trace Tracking“,随后弹出如下图所示的一个进度条来显示我们分析的进度,提示剩余多少时间(特意在写这篇文章的时候临时加的时间剩余提示的部分,感觉对于那些急于想要知道自己结果的同学们来说没看着时间不断变少会有一种满足感,反正我就是这样的,这个和我目前研究的课题还挺相关的)。
分析中的进度条提示
轨迹图和热度图显示
在分析结束后,我们就可以通过点击"Plot Trace"来显示我们分析出来的小鼠运动轨迹。
轨迹图
在很多时候我们不仅要分析运动轨迹,有的时候还想要知道目标物体在各个区域停留的时间长短。这个时候就需要通过热度图来展示以上结果,我在分析运动轨迹的时候同时也分析了热度图。原理很简单,就是把每一帧识别的图像二值化后累加,然后除以帧率就能得到整个分析时间段内的热度图,点击”Plot Heatmap“后如下图所示:
热度图
五 保存数据
最后就是点击”Svae“把我们分析的运动轨迹和热度图的数据保存起来,程序默认会保存到视频所在的文件夹下,名称是在视频名的基础上加上”-Traces-Heatmap“,文件格式是mat格式。
保存的文件
以上就是今天文章的内容,断断续续写了好几天,希望对需要的人有所帮助。想要目前这个版本GUI的可以私信我"轨迹识别"获取下载链接,仅供大家相互交流。