两种运动检测算法的介绍:
帧差法:
帧差法是目前运动目标检测中最常用的算法。帧差法依据的原则是:当视频中存在移动物体的时候,相邻帧(或相邻三帧)之间在灰度上会有差别,求取两帧图像灰度差的绝对值,则静止的物体在差值图像上表现出来全是0,而移动物体特别是移动物体的轮廓处由于存在灰度变化为非0,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。
二维频域运动目标检测:
通过对动态图像的行列分解, 将三维频域内的运动检测问题转化到两组二维频域内进行, 从而降低了滤波器设计的难度。给出了一种提取主运动能量的自适应滤波算法, 通过剔除背景和噪声的频率成分, 有效地检测出运动目标。
复杂度分析:
针对帧差法进行分析,代码复杂度主要集中在absdiff与findContours部分,其中absdiff的迭代次数为2*500*500=50000次,时间为88.46ms(取两百帧计算平均的时间)
针对二维频域运动目标检测算法,这里有两个代码版本:
针对py-new-fuliye.py,代码的复杂度主要集中在两个部分:傅里叶变换以及遍历,在py-new-fuliye.py中,共使用了两次傅里叶变换与两次遍历,遍历的迭代次数次数为2*50*30=300次,时间为:54.175ms
针对pepoplefft.py(改进版)进行分析,使用了两次傅里叶变换(一次正一次逆),进行了一次嵌套遍历,遍历次数为:50*10=500次,时间为: ms
针对pepoplefft.py进行优化调参:
搜寻噪点:
要找到噪点,就要知道经傅里叶高通滤波变换后,剩余的边缘部分在数组中的表现规律,采用numpy绘图表示出来:
经过阈值去噪后,效果如图:
在随后的视频测试中发现其面对复杂环境表现仍不理想,此时考虑选择绘制多个矩形来框选标记多个候选目标,暂时不考虑使用其他的滤波进行去噪,原因为1、会占用原本就不多的处理时间,2、不认为在经过高通滤波后还未被滤掉的噪点会被其他滤波函数滤掉,目标被滤掉的可能性反而更大。