本文转自 http://www.cnblogs.com/mfryf/archive/2012/03/29/2424024.html
所谓的背景相减,是指把摄像头捕捉的图像第一帧作为背景,以后的每一帧都减去背景帧,这样减去之后剩下的就是多出来的特征物体(要侦测的物体)的部分。但是相减的部分也会对特征物体的灰阶值产生影响,一般是设定相关阈值要进行判断。
int _tmain(int argc, _TCHAR* argv[])
{
int thresh_low = 30;
IplImage* pImgFrame = NULL;
IplImage* pImgProcessed = NULL;
IplImage* pImgBackground = NULL;
IplImage* pyrImage = NULL;
CvMat* pMatFrame = NULL;
CvMat* pMatProcessed = NULL;
CvMat* pMatBackground = NULL;
CvCapture* pCapture = NULL;
cvNamedWindow("video", 0);
cvNamedWindow("background",0);
cvNamedWindow("processed",0);
//Create trackbar
cvCreateTrackbar("Low","processed",&thresh_low,255,NULL);
cvResizeWindow("video",400,400);
cvResizeWindow("background",400,400);
cvResizeWindow("processed",400,400);
cvMoveWindow("video", 0, 0);
cvMoveWindow("background", 400, 0);
cvMoveWindow("processed", 800, 0);
if( !(pCapture = cvCaptureFromCAM(1)))
{
fprintf(stderr, "Can not open camera./n");
return -2;
}
//first frame
pImgFrame = cvQueryFrame( pCapture );
pImgBackground = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1);
pImgProcessed = cvCreateImage(cvSize(pImgFrame->width, pImgFrame->height), IPL_DEPTH_8U,1);
pyrImage = cvCreateImage(cvSize(pImgFrame->width/2, pImgFrame->height/2), IPL_DEPTH_8U,1);
pMatBackground = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);
pMatProcessed = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);
pMatFrame = cvCreateMat(pImgFrame->height, pImgFrame->width, CV_32FC1);
cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0);
cvCvtColor(pImgFrame, pImgBackground, CV_BGR2GRAY);
cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY);
cvConvert(pImgProcessed, pMatFrame);
cvConvert(pImgProcessed, pMatProcessed);
cvConvert(pImgProcessed, pMatBackground);
cvSmooth(pMatBackground, pMatBackground, CV_GAUSSIAN, 3, 0, 0);
while(pImgFrame = cvQueryFrame( pCapture ))
{
cvShowImage("video", pImgFrame);
cvSmooth(pImgFrame, pImgFrame, CV_GAUSSIAN, 3, 0, 0);
cvCvtColor(pImgFrame, pImgProcessed, CV_BGR2GRAY);
cvConvert(pImgProcessed, pMatFrame);
cvSmooth(pMatFrame, pMatFrame, CV_GAUSSIAN, 3, 0, 0);
cvAbsDiff(pMatFrame, pMatBackground, pMatProcessed);
//cvConvert(pMatProcessed,pImgProcessed);
//cvThresholdBidirection(pImgProcessed,thresh_low);
cvThreshold(pMatProcessed, pImgProcessed, 30, 255.0, CV_THRESH_BINARY);
cvPyrDown(pImgProcessed,pyrImage,CV_GAUSSIAN_5x5);
cvPyrUp(pyrImage,pImgProcessed,CV_GAUSSIAN_5x5);
//Erode and dilate
cvErode(pImgProcessed, pImgProcessed, 0, 1);
cvDilate(pImgProcessed, pImgProcessed, 0, 1);
//background update
cvRunningAvg(pMatFrame, pMatBackground, 0.0003, 0);
cvConvert(pMatBackground, pImgBackground);
cvShowImage("background", pImgBackground);
cvShowImage("processed", pImgProcessed);
//cvZero(pImgProcessed);
if( cvWaitKey(10) == 27 )
{
break;
}
}
cvDestroyWindow("video");
cvDestroyWindow("background");
cvDestroyWindow("processed");
cvReleaseImage(&pImgProcessed);
cvReleaseImage(&pImgBackground);
cvReleaseMat(&pMatFrame);
cvReleaseMat(&pMatProcessed);
cvReleaseMat(&pMatBackground);
cvReleaseCapture(&pCapture);
return 0;
}