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

来源:互联网 发布:邮箱服务器搭建软件 编辑:程序博客网 时间:2024/05/17 03:46
本篇为之前基于背景模型的运动目标检测的续集,之前主要思想是根据100帧图像的平均图像以及相邻帧差值均值图像,建立背景模型,再来做后续的运动物体检测,结果表明虽然可以成功检测,但受噪声干扰很严重

参考《学习OPENCV》,其去除帧间噪声的方式采用的是对二值图像进行形态学处理(开操作和闭操作),相比较我之前采用的灰度图像去噪方式相比更加直接且有效。


开操作是先腐蚀后膨胀,通常用于去除图像中较小的明亮细节,而保持整体灰度级和较大的明亮特征不变。闭操作是先膨胀后腐蚀,通常用于填充图像中明亮部分的小裂缝。一般去噪则采用开操作+闭操作,首先去除小噪声,其后再修复被腐蚀的明亮区域。


在检测过的二值化图像后采用如下代码:

cvMorphologyEx(Imask,Imask,0,ker,CV_MOP_OPEN,CVCLOSE_ITR);cvMorphologyEx(Imask,Imask,0,ker,CV_MOP_CLOSE,CVCLOSE_ITR);

CVCLOSE_ITR代表腐蚀或者膨胀的次数,迭代次数越多,消除的杂斑越大,但同时代价是侵蚀了较大的边界区域,如下分别是CVCLOSE_ITR=1CVCLOSE_ITR=2的处理结果

CVCLOSE_ITR=1,大部分噪声去除了,但还是有一些较大块的噪声


CVCLOSE_ITR=2,噪声全部消除(当然只针对此帧而言)


消除噪声后,对检测到的目标进行轮廓计算,目标轮廓检测可以更方便知道目标的位置、大小信息,采用边界框可视化效果更好。


轮廓检测opencv函数:

CvContourScanner scanner = cvStartFindContours(Imask,mem_storage,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);

可以理解为检测Imask图像中的外轮廓(而非洞,即内轮廓),并将轮廓点的信息保存至scanner


对于较小的轮廓,可认为是噪声,可通过轮廓周长对其进行筛选:

double len = cvContourPerimeter(c);  //轮廓长度double q = (Imask->height+Imask->width)/4;   //图像周长的1/4

通过比较两个参数,可以筛选出轮廓周长大于图像周长1/4的轮廓。


对轮廓进行多边形拟合:

CvSeq *c_new = cvApproxPoly(c,sizeof(CvContour),mem_storage,CV_POLY_APPROX_DP,0,0);


cvBoundingRect函数可以获得轮廓的外接矩形,这些《学习opencv》书上都有。

最后绘制轮廓以及外接矩形:

cvDrawContours(Imask,c,cvScalar(255),cvScalar(255),-1,2,8);cvRectangle(Imask,cvPoint(rect.x,rect.y),cvPoint(rect.x+rect.width,rect.y+rect.height),cvScalar(255),1,8,0);



最终从实验结果中随机截图出几帧:





可以看出,暂时不论受噪声干扰,帧间差分法用来检测运动目标是有一定效果的,整个算法十分简单。但其也有着明显的不足:就是目标检测不完整!由于同物相减为0,在重叠区域会出现缺口。


此外,它也不能区别目标物体离开的位置(空穴,或者上一帧的位置)和目标现在的位置。






0 0
原创粉丝点击