不得不说matlab的图像处理函数有点多,但速度有时也是出奇的慢。还是想c的指针,虽然有点危险,但速度那是杠杠的。
第二个matlab程序,对运动物体的识别与追踪。
这里我们主要运用帧差法实现运动物体与背景图像的分离,由于视频中的物体较为简单,我们只对两帧图像取帧差(也是为了提高速度)
对于运动物体的提取我们运用了matlab里自带的函数bwareaopen
bwareaopen(src,int),src为二值图像,int为设置的联通域的大小,是对帧差法,在转化为二值的图像进行操作,结果是将大小小于设定的int的连通域置为0;
对于第一帧与第二帧图像运动物体的坐标的提取我们用了自带的regionprops函数
regionprops(src,’‘)其中src为传入的二值图像,’‘内的为你所需要的属性
具体属性可以查看matlab的help
这里我们选用了其中的centroid属性,返回的时连通域的质心坐标,注返回的第一个值为横坐标,第二个值为纵坐标~
对于运动物体的追踪我们用了质心追踪,
在第一二三两帧的帧间差的运动物体的质心求出来后,将质心做差得到的向量预测下一帧间差运动物体可能到达的位置,接下来在对这个位置进行局部的找质心,再做差如此循环。
追踪大致如图(画的不好):
这个相对与全局再次进行bwareaopen,regionprops,速度应该会快一下,而且这是进行局部地搜索所以可以减小背景,或其他噪声的影响。
如图为直接进行帧间差分后的转化的二值图像,即使噪声很大用局部追踪也能跟上。
具体代码:
fanction:
draw-rect
追踪效果:
时间:
注(画框函数引用网上现有的)
可能是matlab问题,这段视频为4k,无法直接读取,所以只能将其转化为图片逐帧读取。
结果是还是太慢,而且不能预读取,好像用这个无法实时,可能与图片为4k也有点关系有点伤