背景相减背景去除

本文转自 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;
}


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值