专业:模式识别与智能系统姓名:王奉甲学号:1401266工业电梯人数计数系统一.系统介绍为了防止电梯超载,还有施工现场的安全问题,采用摄像头获取视频流,运用图像处理技术对进出电梯的双向人数进行计数,用于监测和管理。二.目标识别提取的方法•帧间差分法•光流法•均值漂移算法•haar分类器提取目标•等等1.帧间差分法帧间差分法是利用相邻两帧图像做减法来提取前景物体,由于计算量小,所以运行速度比较快,另外帧间差分法对缓慢变换的光照不是很敏感,所以其用途比较广泛。其基本原理可以用下面公式看出:|i(t)-i(t-1)|T背景|i(t)-i(t-1)|=T前景其中i(t),i(t-1)分别为t,t-1时刻对应像素点的像素值,T为阈值。用OpenCV2.4.4+VisualStudio2012做了个简单的实验可以看出帧差法很简单,但是有很多的缺点。其“双影”和”空洞”比较明显。双影是由于帧差法有2个影子,在该试验中就是轮廓变得很粗,”空洞”是由于物体内部颜色相近,检测不出来。当然帧差法还有个致命的缺点就是阈值T需要人工设定。虽然可以优化,比如三帧差法,还有相关的形态学处理可以消除一些缺点,但是总体来说效果不太理想。2.光流法的目标跟踪自己编写函数中的相关参数感觉很费劲,所以用了OpenCV函数库里两个现成的函数cv::calcOpticalFlowPyrLK和cv::goodFeatureToTrack尝试实现了一下,追踪目标的效果不错,但是没有想到很好的计数方法,所以先搁置了,看以后能不能有好的方法解决一下。三.自己的算法1.思路在视频流(480*640)中设置两条进出线,只讨论这两条线分别是第100行和第300行像素点的变化情况,来分析是否有人员进出,将相邻两帧图像的对应进出线上像素点做差,若大于某一阈值则认为该像素点变化过大将其置为255否则置为0,若某一差值进出线上变化过大的像素点数量超过预定值,则将这一时刻的差值进出线提取出来作为阈值结果线存储到一幅空图像中。一段时间后,这幅空图像将存储一系列的阈值结果线并构成积累图,我们对积累图进行形态学去噪,提取轮廓并加以分析,来进行目标识别和统计人数的工作。2.算法流程图视频图像的采集阈值结果线的提取积累图的提取积累图处理与分析积累图处理与分析计数得到结果3.目标的提取1)阈值结果线的提取boolframeprocess::sun_Linechange1(MatsourceImg){intj,sum=0;uchar*pImg=sourceImg.ptruchar(Pos1);//灰度图像的100行首地址放在pImguchar*pLine=lastLine1.ptruchar(0);//上一帧图像第100行的首地址uchar*pLinecc=ccLine1.ptruchar(0);//阈值结果线for(j=0;jimgCols;j++){if(pImg[j]-pLine[j]12||pImg[j]-pLine[j]-12){sum++;//变化过大的像素点数量pLinecc[j]=255;}else{pLinecc[j]=0;}pLine[j]=pImg[j];}returnsum60;//若一行像素点有60个以上变化了12则布尔变量为true}2)积累图的提取if(sun_Linechange1(colorImage)){pAccl1=accLine1.ptruchar(accNum1);//accLine1为积累图for(j=0;jimgCols;j++){pAccl1[j]=pLine1[j];}accNum1++;}else{if(accNum17){Mattarget(accNum1,imgCols,CV_8UC1);intzeoNum=0;for(i=0;iaccNum1;i++){pTarg1=target.ptruchar(i);pAccl1=accLine1.ptruchar(i);for(j=0;jimgCols;j++){pTarg1[j]=pAccl1[j];if(pTarg1[j]==255){zeoNum++;//积累图中255像素点的数量}}}...3)积累图提取结果1.某时刻一个人经过进出线时的积累图2.某时刻两个人经过进出线时的积累图由上图可以看出当有人经过进出线时,提取的积累图中会显示大片聚集的亮点,当两个人同时进出时积累图会变宽,在随后的过程中,我们会发现对积累图的分析处理就可以实现人员的检测和统计。3.目标的处理和分析if(zeoNum700){morphologyEx(target,target,CV_MOP_CLOSE,Mat());//填充前景物体中的小洞morphologyEx(target,target,CV_MOP_OPEN,Mat());//移除场景中比较小的物体vectorvectorPointcontours;MattargetClone=target.clone();findContours(targetClone,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);for(vectorvectorPoint::iteratorit=contours.begin();it!=contours.end();){if(contourArea(*it)400)it=contours.erase(it);else{it++;}}RectboundingBox;if(contours.size()0)contours.boundingBox=boundingRect(contours[0]);if(boundingBox.width300||contours.size()1){...}else{...}下面我们来运行一下程序。程序运行时的截图:4.程序运行结果分析这个程序有一些局限性就是如果人员比较多,如三个人以上可能误检就比较的严重,好在这个工业电梯最多只装载两个人。测试了几组视频,正确率大概可以达到百分之八十五,但是还有很多地方需要改进,也可以选择再增加一条阈值线来提高精度。