opencv 帧差法 absdiff

opencv 帧差法 absdiff

opencv2.3.1里的以下函数可计算当前帧与背景之差的绝对值。

cv::absdiff(backgroundImage,currentImage,foreground);


如果摄像机是固定的,那么我们可以认为场景(背景)大多数情况下是不变的,而只有前景(被跟踪的目标)会运动,这样就可以建立背景模型。通过比较当前帧和背景模型,就能轻松地跟踪目标运动情况了。这里,最容易想到的比较方式就是当前帧减去背景模型了

代码如下:

using namespace std;
using namespace cv;

int main(int argc,char * argv())
{
	//读入视频
	//VideoCapture capture("CarLights2.avi");
	VideoCapture capture(0);
	//namedWindow("camera",WINDOW_AUTOSIZE);
	//namedWindow("moving area",WINDOW_AUTOSIZE);
	Mat tempframe, currentframe, previousframe;
	Mat frame;
	int framenum = 0;
		//读取一帧处理
	while (true)
	{
		if(!capture.isOpened())
		{
			cout << "read video failure" << endl;
			return - 1;
		}
		//tempframe = capture.read(frame);


		capture >> frame;
		tempframe = frame;
		framenum++; 
		if (framenum == 1)
		{
			cvtColor(tempframe, previousframe, CV_BGR2GRAY);
		}
		if (framenum >= 2)
		{
			Mat currentframe1,currentframe2, currentframe3, currentframe4;
			cvtColor(tempframe, currentframe, CV_BGR2GRAY);//转化为单通道灰度图,此时currentFrame已经存了tempFrame的内容 
			absdiff(currentframe,previousframe,currentframe);//做差求绝对值  
			threshold(currentframe, currentframe, 20, 255.0, CV_THRESH_BINARY);
			dilate(currentframe, currentframe,Mat());//膨胀
			erode(currentframe, currentframe,Mat());//腐蚀

			//显示图像  
			imshow("camera", tempframe);
			imshow("moving area", currentframe);

		}
		//把当前帧保存作为下一次处理的前一帧  
		//cvtColor(tempframe, previousframe, CV_BGR2GRAY);
		waitKey(33);
	}//end while  
}


你可能感兴趣的:(背景差分,前景检测,运动检测,opencv,opencv,帧差法,帧差法,absdiff)