cvRunningAvg函数,作用:用来更新移动平均。又被称为跟踪器,在目标跟踪中具有重要意义。
函数形式:
void cvRunningAvg(const CvArr * image, CvArr* acc, double alpha, const CvArr* mask=NULL)NULL)
参数说明:
image:输入图像,1或3通道,8比特或32比特的float型
acc累加器:,和image一样大小
alpha:更新时,image所占的权重
mask:操作符掩码
if mask(x,y)!= 0 (1-alpha)*acc(x,y)+alpha*image(x,y) =>acc(x,y)
下面使用cvRunningAvg函数,再次实现背景去除的平均法。为了实现这一方法,需要知道场景中像素的均值漂移值从而得出绝对差分的均值和均值漂移,该均值漂移代替图像的标准偏差。程序实现的效果如下:原图: 输出后景图:
输出前景图:
程序代码如下:
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
int main()
{
IplImage *pFrame=NULL;
IplImage *pFrImg=NULL;
IplImage *pBkImg=NULL;
CvMat *pFrameMat=NULL;
CvMat *pFrMat=NULL;
CvMat *pBkMat=NULL;
int nFrmNum=0;
cvNamedWindow("video",1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
cvMoveWindow("video",30,0);//移动窗口
cvMoveWindow("background",360,0);
cvMoveWindow("foreground",690,0);
pFrame=cvLoadImage("f.jpg");
pBkImg=cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1);
pFrImg=cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1);
pBkMat=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1);
pFrMat=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1);
pFrameMat=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1);
cvCvtColor(pFrame,pBkImg,CV_BGR2GRAY);//彩色空间转换
cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);
cvConvert(pFrImg,pFrameMat);//灰度转化
cvConvert(pFrImg,pFrMat);
cvConvert(pFrImg,pBkMat);
cvSmooth(pFrameMat,pFrameMat,CV_GAUSSIAN,3,0,0,0);//高斯滤波,以平滑图像
cvAbsDiff(pFrameMat,pBkMat,pFrMat);//当前帧跟背景图像相减
cvThreshold(pFrMat,pFrImg,60,255.0,CV_THRESH_BINARY);//二值化前景图
cvRunningAvg(pFrameMat,pBkMat,0.003,0);//更新背景
cvConvert(pBkMat,pBkImg);//将背景转化为图像格式,用以显示
cvShowImage("video",pFrame);
cvShowImage("background",pBkImg);
cvShowImage("foreground",pFrImg);
cvSaveImage("background.jpg",pBkImg);
cvSaveImage("foreground.jpg",pFrImg);
cvWaitKey(0);
cvDestroyWindow("video");
cvDestroyWindow("background");
cvDestroyWindow("foreground");
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseMat(&pFrameMat);
cvReleaseMat(&pFrMat);
cvReleaseMat(&pBkMat);
return 0;
}