平均背景法

主要是参考《学习OPENCV》书中例程而写的:经测试通过。。。。。。

background.h头文件中主要是子函数的声明。

#include "background.h"
#include "stdio.h"




//float, image of 3-channel
IplImage *iavgF, *idiffF, *iprevF, *ihiF, *ilowF;
IplImage *iscratch, *iscratch2;


//float,image of 1-channel
IplImage *igray1, *igray2, *igray3;
IplImage *ilow1, *ilow2, *ilow3;
IplImage *ihi1, *ihi2, *ihi3;


//byte, image of 1-channel
IplImage *imaskt, *imask;


//counts number of images learned for averaging later
float icount;






int main(int agrc, char** agrv)
{
IplImage* image;
CvCapture* capture = cvCaptureFromFile("11.avi");
image = cvQueryFrame(capture);

cvNamedWindow("background", 1);
cvNamedWindow("srcimage", 1);

allocateimage(image);


int NC = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);


while(icount < NC)                         //accumulate background
{
accumulatebackground(image);
image = cvQueryFrame(capture);
icount++;
printf("creating model, wait!!\n");
}


createmodefromstats();                 // create model from statistics


while(1)
{
image = cvQueryFrame(capture);
if (!image)
{
return -1;
}
backgrounddiff(image, imask);
cvShowImage("srcimage", image);
cvFlip(imask, imask, 0);
cvShowImage("background", imask);
int c = cvWaitKey(cvGetCaptureProperty(capture, CV_CAP_PROP_FPS));
if (c == 'p')
{
int d = cvWaitKey(0);
while(d != 'p');
}
if (c == 27)
{
cvDestroyAllWindows();
return -1;
}



}


int c = cvWaitKey(0);
if (c == 27)
{
return -1;
}


releaseimge();






return 0;

}


//
//allocate image.
void allocateimage(IplImage* image)
{
CvSize sz =cvGetSize(image);


iavgF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
idiffF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
iprevF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
ihiF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
ilowF = cvCreateImage(sz, IPL_DEPTH_32F, 3);
ilow1 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
ilow2 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
ilow3 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
ihi1 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
ihi2 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
ihi3 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
cvZero(iavgF);
cvZero(idiffF);
cvZero(iprevF);
cvZero(ihiF);
cvZero(ilowF);
icount = 0.00001;


iscratch = cvCreateImage(sz, IPL_DEPTH_32F, 3);
iscratch2 = cvCreateImage(sz, IPL_DEPTH_32F, 3);
igray1 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
igray2 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
igray3 = cvCreateImage(sz, IPL_DEPTH_32F, 1);
imaskt = cvCreateImage(sz, IPL_DEPTH_8U, 1);
imask = cvCreateImage(sz, IPL_DEPTH_8U, 1);
cvZero(iscratch);
cvZero(iscratch2);
}


//
//learn the background statics for one more frame
//
void accumulatebackground(IplImage* image)
{
static int first =1;
cvCvtScale(image, iscratch, 1, 0);
if (!first)
{
cvAcc(iscratch, iavgF, NULL);
cvAbsDiff(iscratch, iprevF, iscratch2);
cvAcc(iscratch2, idiffF, NULL);
icount += 1.0;
}
first = 0;
cvCopy(iscratch, iprevF);


}




//
//create model from statistics
void createmodefromstats()
{
cvConvertScale(iavgF, iavgF, (double)(1.0/icount));
cvConvertScale(idiffF, idiffF, (double)(1.0/icount));


//make sure diff is always something
//
cvAddS(idiffF, cvScalar(1.0, 1.0, 1.0), idiffF);
//
//set high threshold
float scale;
scale = 7.0;
cvConvertScale(idiffF, iscratch, scale);
cvAdd(iscratch, iavgF, ihiF);
cvSplit(ihiF, ihi1, ihi2, ihi3, NULL);
//
//set low threshold
scale = 6.0;
cvConvertScale(idiffF, iscratch, scale);
cvSub(iavgF, iscratch, ilowF);
cvSplit(ilowF, ilow1, ilow2, ilow3, NULL);


}


//
//create a binary
void backgrounddiff(IplImage* image, IplImage* imask)
{
cvCvtScale(image, iscratch, 1.0);
cvSplit(iscratch, igray1, igray2, igray3, NULL);
//
//channel 1
cvInRange(igray1, ilow1, ihi1, imask);
//
//channel 2
cvInRange(igray2, ilow2, ihi2, imaskt);
cvOr(imask, imaskt, imask);
//
//channel 3
cvInRange(igray3, ilow3, ihi3, imaskt);
cvOr(imask, imaskt, imask);


//
//finally, invert the results
cvSubRS(imask, cvScalar(255), imask);


}


//
//release image
void releaseimge()
{
cvReleaseImage(&iavgF);
cvReleaseImage(&iprevF);
cvReleaseImage(&idiffF);
cvReleaseImage(&ihiF);
cvReleaseImage(&ilowF);
cvReleaseImage(&ilow1);
cvReleaseImage(&ilow2);
cvReleaseImage(&ilow3);
cvReleaseImage(&ihi1);
cvReleaseImage(&ihi2);
cvReleaseImage(&ihi3);
cvReleaseImage(&igray1);
cvReleaseImage(&igray2);
cvReleaseImage(&igray3);
cvReleaseImage(&iscratch);
cvReleaseImage(&iscratch2);
cvReleaseImage(&imaskt);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值