快捷搜索:  汽车  科技

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹frame = read(V 362);% 获取视频第362帧第二步,上图的视频中又很多区域要分析,作为新手教学,我们选择每一个区域内的画面进行分析。那么我们就先随便打开某一帧的画面,然后选择我们要分析的区域,代码如下: 'File Selector');%获取MP4或者Avi格式的视频文件路径以及名称V=VideoReader([pathname1 filename1]);%读取视频Framerate=V.FrameRate;%获取视频帧率

对于很多生命科学领域的研究者来说,研究生物的行为是很多人研究工作中必不可少的部分。在进行生物行为研究工作的时候,生物的运动又是重中之重。这这里我以小鼠的一段运动视频为例,教大家用Matlab来分析视频中物体的运动轨迹。这里还是使用之前一篇文章所使用的视频,我们今天只分析视频中11秒到14秒片段里一只老鼠的运动轨迹,也就是下面这个画面。

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(1)

视频出处见7月29号的文章

导入视频

第一步,我们来导入视频,代码如下:

[filename1 pathname1] = uigetfile({'*.mp4';'*.avi';'*.*'}...

'File Selector');%获取MP4或者Avi格式的视频文件路径以及名称

V=VideoReader([pathname1 filename1]);%读取视频

Framerate=V.FrameRate;%获取视频帧率

选区要分析的区域

第二步,上图的视频中又很多区域要分析,作为新手教学,我们选择每一个区域内的画面进行分析。那么我们就先随便打开某一帧的画面,然后选择我们要分析的区域,代码如下:

frame = read(V 362);% 获取视频第362帧

frame=rgb2gray(frame);%把彩色的图像转换为灰度图

figure(1)%生成一个图形窗口figure1

imshow(frame);%显示视频第362帧

rec=imrect(gca [ V.Width/2 V.Height/2 15 20]);%生成一个可拉伸的矩形

运行上面这部分代码后,就能生成第362帧的画面以及一个可拉伸的矩形框,选中我们要分析的区域后的画面如下图所示:

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(2)

随后截取这部分区域,并显示出来,接下来我们分析的每一帧都会用到这个框框的坐标。

p=ceil(getPosition(rec));%获取拉伸后矩阵的坐标

frame_1=frame(p(2):p(2) p(4) p(1):p(1) p(3));%截取矩形框中的图像

imshow(frame_1)%显示截取的图像

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(3)

识别物体

我们人眼很容易就能认出上图中的老鼠在图像的大概位置。我们为什么能把老鼠和周围环境分开,因为老鼠亮度(其它视频中也可以是颜色,形状等等)和周围环境的亮度有很较大差别。那么,我们就用类似的方法让计算机也能识别出来老鼠。在这里,老鼠是很黑的,那么我们就可以让计算机去识别相对较黑的区域。要让计算机进行识,起码要让计算机知道大概数值,多黑以下才算是老鼠吧!这里我们可以用之前一篇讲如何画图的文章中使用过的surf函数,把图像的灰度值转换为空间高度和颜色,这样我们好人为的设定具体的数值让计算机去执行。当然,也通过编写算法,让计算机自己去完成这一步。运行surf(frame_1);,后我们就看到了一个三维曲面,高度代表了灰度值,通过转动视角,我们可以看到老鼠所在的区域以及环境的灰度值的大概范围,如下图所示。

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(4)

从图中可以看到,老鼠所在的位置曲面明显凹陷进去,调整视角到老鼠所在平面与电脑或者手机屏幕垂直的位置后,我们差不多可以把阈值设定为56左右,可以认为图像中灰度值低于56以下的都是老鼠。

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(5)

随后运行以下代码,把我们要的区域单独显示出来:

Threshold=56;%设置阈值

frame_2=frame_1<Threshold;%进行逻辑判断,亮度小于阈值=1,否者为=0

imshow(frame_2);

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(6)

结果如上图所示,我们发现,老鼠所在区域被单独显示出来了,可是多了一些我们不想要的背景噪音。这个时候,我们可以再降低阈值去掉这些噪音,比如将阈值设为50。

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(7)

阈值降低了以后,背景噪音被完全减掉了,老鼠也单独显示出来了,可是和上图相比,老鼠变“瘦了”,显示的老鼠所在区域不够理想。其实在阈值为56的情况下得到的图,我们可以通过其它的一些方法来去掉背景噪音。仔细观察我们可以发现那些噪音都是比较小的一些区域,我们可以用regionprops函数得到图像中显示的区域的相关参数。

ROI=regionprops(frame_2);

运行之后,双击工作区的ROI 可以查看都有那些属性:

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(8)

我们可以通过这个函数,得到图像中区域的,面积,质心,以及能够把区域框起来的边框坐标。分析以上数据,我们不难发现,噪音的面积是很小的,我们直接把小面积的噪音去掉就好。考虑老鼠会一直运动,对面的面积可能变化,我们可以尝试把150以下的全都去掉,bwareaopen函数正好可以实现这个功能。

frame_3=bwareaopen(frame_2 150);

ROI=regionprops(frame_3);%测量图像内区域的特征

cent=ROI.Centroid;%获取区域质心

运行以后,ROI就只有一个区域的参数啦!然后我们就可以通过调用ROI中的参数,来显示出老鼠的位置。

imshow(frame_3);

hold on;%在原图基础上继续画图

scatter(ROI.Centroid(1) ROI.Centroid(2) 10 'MarkerEdgeColor'...

'none' 'MarkerFaceColor' [1 0 0] 'LineWidth' 0.1);

rectangle('Position' ROI.BoundingBox 'EdgeColor' 'b');

hold off

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(9)

上图中红色的点就是老鼠的质心,蓝色框框就是老鼠所在范围区间。把这些信息画在原图上,就是下面这样的效果:

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(10)

好了,在一张图的情况我们找到了老鼠的位置信息,那么接下来,我们只用使用循环把我们要分析的时间内所有帧的老鼠位置信息找到就行了!老鼠在11秒到14秒之间的运动轨迹和速度如下:

matlab移动轨迹模拟,用Matlab来识别中物体的运动轨迹(11)

大家可以结合之前关于GUI制作的文章,编写一个更方便快捷的程序。今天的文章就到这了,想了解和学习更多关于Matlab以及神经科学的知识请关注我!

今天示例的完整代码有需要的朋友可以私信我,只要我看到了,会尽量回复你的!

欢迎转载,请注明出处,谢谢!

猜您喜欢: