OpenCV图像处理入门学习教程系列,上一篇第四篇:基于LoG算子的图像边缘检测
运动目标检测
关于运动目标检测的方法总结,目前能够实现运动物体检测的方法主要有以下几种:
1)背景差分法:能完整快速地分割出运动图像。其不足之处是易受光线变化影响,背景的更新是关键。不适用于摄像头运动的情况;
2)光流法:能检测独立运动的图像,可用于摄像头运动的情况,但是计算复杂耗时,较难实现实时监测;
3)帧差法:受光线变化影响较小,简单快速,但不能分割出完整的运动对象,需进一步运用目标分割算法。还有一些改进的算法,主要致力于减少光照影响和检测慢速物体变化。
以上是大多数文献中对这三种方法的评价,由于是初次接触,而且实验中的需求是静止相机,因此采用最简单的方法:背景差分法。
背景差分法实现步骤
将背景差分法的实现步骤总结如下:
1)进行图像的预处理:主要包括对图像进行灰度化以及滤波。
灰度化的方法及其C语言实现可参考《Canny边缘检测算法原理及其VC实现详解(二)》一文;关于图像滤波,通常可采用的方法有中值滤波、均值滤波以及高斯滤波等。关于高斯滤波的实现详见《高斯图像滤波原理及其编程离散化实现方法》一文。
2)背景建模:这是背景差法较为重要的第一步。目前大多的思路都是根据前N帧图像的灰度值进行区间统计从而得到一个具有统计意义的初始背景。在第一次的实现过程中,采用第一幅图片作为背景图,这样比较简单。
3)前景提取:将当前最新的图像与背景做差,即可求得背景差图,然后根据一定的方法对改图进行二值化,最终获得运动前景区域,即实现图像分割。
运动检测和背景更新方法实现的步骤
所研究的运动检测和背景更新方法实现的步骤如下:
(1)开辟静态内存,对图像进行初始化准备采集;
(2)采集图像,定义参数k,作为图像序列计数。采集第1幅图像时,则根据第一帧的大小信息进行矩阵、图像的初始化,
并且将第一帧图像进行灰度化处理,并转化为矩阵,作为背景图像及矩阵;如果k不等于1则把当前帧进行灰度化处理,
并转化为矩阵,作为当前帧的图像及矩阵。用当前帧的图像矩阵和背景帧的图像矩阵做差算出前景图矩阵并对其进行
二值化以便计算它与背景帧差别较大的像素个数,也就是二值化后零的个数。
当第一帧的异物大于1W个像数点则需要将当前帧存储为第一帧,并且将系统的状态转为1——采集第二帧;
第一帧和第二帧的异物都大于1W个像数点时,将当前帧存储为第二帧,通过判断第一帧和第二帧的差值来确定两帧是否连续,
若连续则将系统状态转为2——采集第三帧,若不连续则报警,并把系统状态转为0——采集背景帧;
当第一帧和第二帧的异物都大于1W个像数点, 而第三帧没有时则报警;
若连续3帧的异物都大于1W个像数点时,将当前帧存储为第三帧,通过判断第二帧和第三帧的差值来确定两帧是否连续,
若连续则将更新背景,若不连续则报警。然后把系统状态转为0——采集背景帧。
注意其中有一个0