视频序列中人体运动目标的检测与跟踪研究信息学院信研11毕莎莎612081002004摘要:本文提出的算法是在Linux系统Fedora8、GCC编译器平台上进行设计的,通过实验验证了算法的可行性,并且我们提出的算法大大提高了运动目标检测和跟踪的准确度,减少了计算量,提高了系统的实时性。该系统算法分为三部分:首先利用图像帧差进行运动目标的提取;然后利用模式识别分析目标的特征,对目标进行分类;最后得到目标的形心,对人体目标进行匹配、跟踪并计数,实时给出越过计数线的人数。实验证明该算法简单可行,统计数据具有较高的正确率。关键词:帧间差分;运动检测;目标跟踪,计数;1、绪论1.1课题相关背景目标的识别与跟踪是基于对一个图像序列的研究,从序列图像中检测到运动的目标,并且对目标运动的规律加以预测,实现对指定的目标进行准确且连续的跟踪。其目的是通过计算机视觉从复杂的变化的背景环境中准确识别出所需的运动目标,提取稳定的目标特征,并对目标的位置和姿态等信息进行快速实时的跟踪。随着计算机处理能力的显著提高,该技术在众多领域都有越来越广泛的应用。1.2项目简介本项目利用图像处理和模式识别的方法研究并设计了基于视频的客流量统计系统。本文提出的算法是在Linux系统Fedora8、GCC编译器平台,利用海康威视的采集卡及摄像头进行设计的,通过实验验证了算法的可行性,并且我们提出的算法大大提高了运动目标检测和跟踪的准确度,减少了计算量,提高了系统的实时性。2、相关知识介绍2.1Fedora8系统本项目之所以选择Fedora8系统主要是因为:fedora8的系统内核和海康威视采集卡DS4008HS驱动要求的内核相匹配;另外此项目运行时,要长期处在工作的状态,需要比较稳定的操作系统。而Linux系统Fedora8比较稳定;可移植性较好;具有安全性的服务器,很少会感染病毒,所以本项目选择了此操作系统。2.2C语言介绍C语言的特点:1)语言表达能力强。2)语言简洁、紧凑,使用灵活,易于学习和使用。3)数据类型丰富,具有很强的结构化控制语句。4)语言生成的代码质量高。5)语法限制不严格,程序设计自由度大。6)可移植性好。用C语言编写的程序基本上不作修改就能用于各种型号的计算机和各种操作系统。2.3海康威视采集卡海康DS4008HS:开发支持:1、提供完整的SDK开发包、DEMO演示软件及其源程序,SDK与H卡兼容SDK包含了板卡开发软件、播放器开发软件、网络开发软件、MediaPlayer控件。SDK开发包提供的函数有很多,在本项目中用到的有:InitDSPs();初始化DSPChannelOpen();通道打开,本项目使用的是第4通道ChannelClose();通道关闭RegisterImageStreamCallback();注册数据voidImageStreamCallback(unsignedintchannelNumber,void*context)中断函数,每40ms调用一次,即每秒调用25次2、支持Windows2000/XP/2003,Linux操作系统。3、系统设计3.1系统设计思想本系统选用海康威视的采集卡,摄像头,在装有Fedora8系统的计算机上进行开发。在终端中使用命令对程序进行编译和调试。当程序运行时,可以在界面观察到摄像头所录入的视频,及在我们所添加的窗口中看到相关的处理信息。3.2系统需求分析1)首先对界面进行修改与设计,方便显示跟踪及计数的信息2)可以准确跟踪到某一运动物体。3)对经过某一区域的人进行计数。4)可适用于超市,或大卖场等的入口及出口处,对客流量进行统计3.3系统功能模块整个系统设定的主要功能模块有:图像预处理,人体跟踪模块,计数模块图像预处理:膨胀、腐蚀、滤波等人体跟踪:跟踪到人体的运动坐标及轨迹计数:对进入某一区域的人进行计数3-1系统流程图3.4界面的设计GTK是用于实现图形用户接口的函数库。一般情况下,如果要创建普通的图形接口应用程序,使用GTK就可以了。GTK+和Gnome构件库提供了极为丰富的构件,足以构造非常复杂的用户界面。但是,如果需要开发新构件,或者要创建绘图程序,仅使用GTK就不够了。这时可以采用Xlib,更好的方法是使用GDK库,它可以应付绝大多数的编程需要。初始界面的显示:图3-2初始界面当按下preview按钮时,显示如下:视频序列输入运动分割图像预处理运动目标转换运动人体跟踪计数图3-3Preview图像4、运动物体的检测4.1帧间差分法原理在众多基于运动图像序列检测的算法之中,帧间差分法是依据相邻两帧图像间的强相关性而提出的检测算法。所谓帧间差分法,是指将相邻两帧图像中的相应像素点的灰度值进行相减,若其差值较小,可以认为该点无运动目标;相反,若灰度差值较大,则认为有运动目标。4.2帧间差分法实现YUV4:2:0的格式:下面八个像素为:[Y0U0V0][Y1U1V1][Y2U2V2][Y3U3V3][Y5U5V5][Y6U6V6][Y7U7V7][Y8U8V8]存放的码流为:Y0U0Y1Y2U2Y3Y5V5Y6Y7V7Y8映射出的像素点为:[Y0U0V5][Y1U0V5][Y2U2V7][Y3U2V7][Y5U0V5][Y6U0V5][Y7U2V7][Y8U2V7]即四个像素点共用同一个U,V,依次类推下去,而在imageBuf中的存放方式为:YYYYYYYY[352*288]UUUU[176*144]VVVV[176*144]。隔帧图像对应像素点取帧差:本设计中使用的检测运动物体的方法是帧差法:即两帧图像对应像素点的Y,U,V的值相减,若满足abs(Y1-Y2)60||abs(U1-U2)50||abs(V1-V2)50的话,则把此点置黑。把所有的黑点找出来则可以检测到运动物体的轮廓。阈值的设定可以根据实际情况来规定,根据现场的情况进行调试。当阈值比较小时,检测到被跟踪物体的像素点比较多,而干扰点,噪声点也会比较多;反之,检测到轮廓的像素点则比较少,会对结果造成影响。而当人停止在某一处时,若噪声干扰很少的话,则认为屏幕是白色。当按下界面上的trace按钮,即trace=1时,显示帧差:图4-1帧差图像5、图像预处理膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的。5.1膨胀膨胀是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。A被B膨胀是所有位移z的集合,这样,和A至少有一个元素是重叠的。我们可以把上式改写为:结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。⑴用3*3的结构元素B,扫描图像A的每一个像素;⑵用结构元素与其覆盖的二值图像做“与”操作;⑶如果都为0,结果图像的该像素为0,否则为1,使二值图像扩大一圈。5.2腐蚀腐蚀是对Z中的集合A和B,B对A进行腐蚀的整个过程如下:⑴用3*3的结构元素B,扫描图像A的每一个像素;⑵用结构元素与其覆盖的二值图像做“与”操作;⑶如果都为1,结果图像的该像素为1,否则为0;腐蚀处理的结果是使原来的二值图像减小一圈。5.3结果分析先腐蚀后膨胀的过程:利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不会明显改变原来物体的面积。而先膨胀后腐蚀的过程:利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但平时并不会明显改变原来物体的面积。通常由于噪声的影响,图像在阈值化后所得到的边界通常都很不平滑,物体区域具有一些噪声孔,而背景区域上散布着一些小的噪声物体,连续的开和闭运算可以有效地改善这种情况,而有时,我们需要经过多次腐蚀之后再加上相同次数的膨胀,才能产生比较好的处理效果。可见图像腐蚀与图像膨胀相结合有时可使图像有较理想的处理效果。6、运动人体的跟踪算法6.1跟踪算法1(1)寻找有效点在检测到运动目标后,用一个10*10的方格对所得到的帧差的像素点进行循环,若有一个黑点出现在此方格内,则停止循环,把此方格置黑,并把方格的最左上角的点存放到一个数组p[1200]里,并把此点的标记设为1,即用一个点来代表整个方格,以便接下来寻找连通域。(2)寻找连通域从存放有效点的数组p中取一个标记为1的点,把它放到zone1[k3][p1[k3]]中,然后把此点与数组p中的各个点进行比较,看是否有与这个点的x,y坐标相差小于等于11的点,若存在的话,则也把这些点也放在zone1[k3][p1[k3]]内,并把标记改为0。就这样依次循环,可寻找到帧差图像所有的连通域,最后可得到若干个连通域。则可以把每一个大于5个点的连通域当做一个运动的人,其他的当做噪声点处理。(3)画圆并把内部涂黑找到连通域之后,寻找此连通域内的最左minxx,最右maxx,最上miny,及最下maxy的第一个出现黑点的坐标,可以近似找到此区域的中心,然后以此中心点为圆心,半径为25来画圆(半径大小根据实际情况来定,但圆要覆盖住人的帧差),并把此圆内的部分涂黑。这样就可以把检测到的帧差转换成一个黑色的圆。当人运动时,此圆也会相应的运动。当trace=0时显示imgbuf4内的内容,即根据连通域内的点画的圆图6-1一人两个人并排行走的时候则会建立两个结点,可以跟踪到两个圆:图6-2两人并排行走(4)帧之间圆的匹配跟踪在要进行计数时,要先在距边界大概50-100个像素的位置建立结点,然后在两帧之间匹配结点圆的圆心坐标,若两圆心坐标的距离小于30时,则可认为现在的圆就是之前的圆在此刻的状态,则更新结点信息,然后依次更新,到240时,删掉这个结点,然后对IN进行计数。反之亦然,在190-240之间建立结点,跟踪到50时,删除结点,并对OUT进行计数。这样可以准确地对一段时间内进出某一区域的人进行计数。而跟踪算法除了用于计数,还可以根据不同时刻的坐标值,来分析运动人体的轨迹。6.2跟踪算法2(1)首先创建结点首先设定两个创建结点的区域,50-100和190-240,若在此区域内出现有效点,则对这些点进行求连通域,方法如5.1(2),若连通域内的点大于10,则求连通域的边界,确定连通域的中心画圆,创建结点。若连通域的点数大于30的话,认为创建区不止有一个人,则对此大的连通域进行划分。方法如下:求出连通域的宽度dx,把一个人的标准宽度设为40,则用dx/40可得到n个人,dx%40可得到取整之后的余数,对这个余数进行判断,若dx%40大于25的话,n+1;否则就为n。然后分别求出各个人的中心,画圆,创建结点。(2)进行跟踪建立了各自的结点后,要对各个结点进行跟踪,方法如下:1)在下一帧时,各个结点首先在半径为30的圆内进行寻找自己的点,把找到的点标记为0,存放在数组node[i]里,然后向前移动结点中心,还是在半径为30的圆内寻找标记为1,即还没被找到过的点,找到之后也存在刚刚的数组中,再次移动中心坐标找点,循环四次,中心y坐标每次移动5个像素点,最后把有找到的点都放在node[i]里。2)求这些点构成的区域的上、下、左、右四个边界;3)求得边界之后,判断这个区域的高度之差是不是大于一个人的高度,若(node[i].maxy-node[i].miny)40&&node[i].in_or_out==1(进)时,则把node[i].maxy-50,把这高度为50的点赋给此结点,计算结点的中心,把之前的结点中心更新为此中心,最后把剩下的点的标志位再置为1。当方向标志node[i].in_or_out==0时方法类似。(3)跟踪计数在50-100的创建区域创建的点node[i]且node[i].in_or_out为1,对其进行更新信息,而当结点的中心y坐标大于240的时候,则对计数num1进行加1。在190-240的创建区域创建的点node[i]且node[i].in_or_out为0,对结点进行跟踪,不断对其进行更新结点信息,而当结点的中心y坐标小于50的时候,则对计数num0进行加1。6.3两种算法的比较第一种算法仅适用于单个人和多个人并排行走,前后挨的比较近