基于平均背景建模的运动目标检测

来源:互联网 发布:淘宝买家秀福利木耳 编辑:程序博客网 时间:2024/04/30 05:57

建立一个场景模型,包含图像灰度均值、帧间平均差值。

对于输入的后续视频,当灰度在区间内时,认为是静止区域,反之为运动目标。判断静止灰度区间为

                                                             

diff实际上可认为是为了抑制一定的噪声,当图像序列噪声很小时,效果不错,但在实际场景基本不适用,例如我的实验图像。

 

 

我使用了前100帧图像作场景建模,暂未考虑场景更新问题,因此不能适用于背景具有运动目标的情况(例如风吹窗帘、摇曳的树),光线问题。

 如下三幅图是对运动目标的检测,可以看出除了人物还有大量的噪声被检测出来。





因此,我对背景模型进行了去噪处理,采用了cvsmooth函数中的简单模糊、高斯、中值等,本以为中值效果应该最好,但由于噪声分布过于紧密,中值去噪并不好,最后采用15大小的普通加权去噪,效果如下。



使用大窗口进行模糊确实可以去除噪声,但对目标也会进行模糊,检测出现问题,此外,当噪声过大时,信号被严重干扰,甚至被淹没。说明简单的背景模型或去噪是行不通的。的背景模型或去噪是行不通的。


#include<highgui.h>#include<cv.h>#include<cxcore.h>void main(){       CvCapture *capture = cvCreateFileCapture("Walk2.mpg");CvSize img_sz = cvSize(384,288);IplImage *pic;    IplImage *frame = cvCreateImage(img_sz,8,1);IplImage *frame2 = cvCreateImage(img_sz,8,1);IplImage *framedn = cvCreateImage(img_sz,8,1);IplImage *Imask = cvCreateImage(img_sz,IPL_DEPTH_8U,1);IplImage *Iscratch = cvCreateImage(img_sz,IPL_DEPTH_32F,1);IplImage *IavgF = cvCreateImage(img_sz,IPL_DEPTH_32F,1);IplImage *IpreF = cvCreateImage(img_sz,IPL_DEPTH_32F,1);IplImage *Iscratch2 = cvCreateImage(img_sz,IPL_DEPTH_32F,1);IplImage *IdiffF = cvCreateImage(img_sz,IPL_DEPTH_32F,1);IplImage *IhiF = cvCreateImage(img_sz,IPL_DEPTH_32F,1);IplImage *IlowF = cvCreateImage(img_sz,IPL_DEPTH_32F,1);int fnum=1,Icount = 100,ht=5;cvZero(IavgF);cvZero(Iscratch);cvZero(IpreF);cvZero(Iscratch2);cvZero(IdiffF);     while(fnum<=Icount)   {   pic = cvQueryFrame(capture);   if(!pic) break;   cvCvtColor(pic,frame,CV_RGB2GRAY);   cvSmooth(frame,framedn,CV_BLUR,15);   cvCvtScale(framedn,Iscratch,1.0,0);   cvAcc(Iscratch,IavgF);   cvAbsDiff(Iscratch,IpreF,Iscratch2);   cvAcc(Iscratch2,IdiffF);   cvCopy(Iscratch,IpreF);   fnum++;} cvConvertScale(IavgF,IavgF,(double)(1.0/(Icount)));   /*均值*/ cvConvertScale(IdiffF,IdiffF,(double)(1.0/(Icount)));  /*帧间插值*/ cvAddS(IdiffF,cvScalar(1.0),IdiffF); cvConvertScale(IdiffF,Iscratch,ht); /*high threshold = low threshold*/ cvAdd(IdiffF,IavgF,IhiF); cvSub(IavgF,Iscratch,IlowF); while(1) {    pic = cvQueryFrame(capture);   if(!pic) break;   cvCvtColor(pic,frame,CV_RGB2GRAY);   cvSmooth(frame,framedn,CV_BLUR,15);   cvCvtScale(framedn,Iscratch,1.0,0);   cvInRange(Iscratch,IlowF,IhiF,Imask);   cvSubRS(Imask,cvScalar(255),Imask);   cvNamedWindow("mask");   cvShowImage("mask",Imask);   cvNamedWindow("frame");   cvShowImage("frame",frame);   cvWaitKey(33); }}



0 0
原创粉丝点击