OpenCV 视频人数统计研究

        最近有空研究了一下基于Opencv的视频人数统计。总结了一下,视频人数统计系统的工作流程主要包括以下几个部分:

1.视频捕获

        从视频源(摄像头或视频文件)获取到视频图像数据。

2.目标提取(背景建模、前景分析)

        由视频图像分割出视频图像中的运动区域。

        常见的方法:高斯背景建模,帧差法,三帧差法。

3.目标识别(模式识别、特征点分析)

        根据目标特征分析得到具体目标。比如人脸识别、头肩部识别等。

        OpenCV里可以使用Haar特征 、级联分类器来进行目标检测。但分类器的训练需要从事先准备好的成百或上千张正面或反面样本中训练得到,整个过程会比较复杂,这种方法应该会达到很好的检测效果 。OpenCV也自带了一些已经训练好的包括人眼、人脸和人体的分类器(位于OpenCV安装目录\data\haarcascades目录下,分类器是XML类型的文件),可以直接使用这些分类器来进行图像检测,但由于使用的环境不同,这些分类器不一定是最优的,检测效果不一定会很好,这些现成的分类器只是提供了一个基本的参考,在实际使用时,还需要根据实际环境对分类器中的配置参数做一些调整和优化才能使检测结果比较准确。当然,此种方式的开销也会大,而且只有OpenCV2.0版本以上才支持,因此在嵌入式领域,这并不是一个很好的方式。

4.目标跟踪

       检测目标在每一帧的空间位置。从而得到目标的运动估计。

       基本方法:
       直方图特征匹配:根据目标区域的颜色直方图特征进行目标匹配。分别对运动目标的前后两帧计算颜色分布的直方图,如果两者的颜色直方图最接近,则认为目标匹配成功。

       运动目标连续性匹配:利用相邻两帧图像中待匹配的目标在时间和空间上的相关性。由于视频中相邻两帧间时间间隔很短,可以认为在相邻两帧间目标是做匀速运动。这样,可以根据当前目标的运动速度和方向来预计目标在下一帧的位置,如果下一帧的所有运动目标中存在与待匹配目标的预期位置最接近的,则认为目标匹配成功。

       OpenCV里可以使用CamShift算法直接对彩色图像进行跟踪。它的基本原理也是通过直方图特征来进行目标匹配。测试了一下,在对我使用的视频进行跟踪时,效果不是很理想,会出现误跟踪的情况,没有达到预期的效果,而且CamShift算法是直接对彩色图像进行跟踪,开销会比较大,这里并不是说CamShift算法不好,其实视频图像处理本身就跟具体的外界环境有关,每一种图像算法一般都是针对特定的环境,并不是通用的,在某些环境下,比如目标物体的颜色跟环境差异比较明显,CamShift算法可能会达到比较好的效果。

5.轨迹分析

        根据目标的运动轨迹计算出目标的运动方向和位移等,判断目标是进入还是离开指定区域,从而对目标进行数目统计。

编程实现

        以下是采用运动目标连续性匹配算法实现的视频人数统计系统截图。开发环境是Opencv2.3.0+VS2005。

        具体算法参考了论文《一种基于人头特征的人数统计方法研究》 作者:顾德军 伍铁军,论文介绍的很详细。这里就不再鳌述了。测试视频文件从优酷(地址:http://v.youku.com/v_show/id_XMTY2MDY1OTk2.html)上找到,从视频文件可以看出拍摄视频摄像头的是斜向下安装,此种方式得到的二值图像的人头特征不是很明显,因而不太好利用人头特征来进行目标识别。这里只是简单利用了运动目标面积大小来做了匹配,当多人之间互相有重叠或包含其它物体时,就不能很好的区分开来。

        一种改进的方法是摄像头采用头顶式的安装,这样经过二值化处理的人头特征应该会比较明显一些,而且人头之间不会有重叠的现象,准确率会更大一些。但由于没有该环境下的视频数据,因次没办法来验证识别率到底如何。如果有对这方面感兴趣的朋友,可以一起来交流学习。



参考文献:

1.《一种基于人头特征的人数统计方法研究》 作者:顾德军 伍铁军

2.《基于视频的客流技术系统的研究》 作者:田京雷 毕胜

3.《智能视频中基于机器学习的自动人数统计》 作者:贾彗星 章毓晋


猜你喜欢

转载自blog.csdn.net/feihu521a/article/details/8279014