www.pudn.com > motion.zip > MotionDetector2.cs


// Copyright © Andrew Kirillov, 2005 
// andrew.kirillov@gmail.com 
// 
namespace motion 
{ 
	using System; 
	using System.Drawing; 
 
	using Tiger.Imaging; 
	using Tiger.Imaging.Filters; 
 
	///  
	/// MotionDetector2 
	///  
	public class MotionDetector2 : IMotionDetector 
	{ 
		private IFilter	grayscaleFilter = new GrayscaleBT709(); 
		private Difference differenceFilter = new Difference(); 
		private IFilter thresholdFilter = new Threshold(15, 255); 
		private IFilter openingFilter = new Opening(); 
		private IFilter edgesFilter = new Edges(); 
		private Merge mergeFilter = new Merge(); 
 
		private IFilter extrachChannel = new ExtractChannel(RGB.R); 
		private ReplaceChannel replaceChannel = new ReplaceChannel(RGB.R); 
		private MoveTowards moveTowardsFilter = new MoveTowards(); 
 
		private FiltersSequence	processingFilter = new FiltersSequence(); 
 
		private Bitmap	backgroundFrame; 
		private int		counter = 0; 
 
		// Constructor 
		public MotionDetector2() 
		{ 
			processingFilter.Add(differenceFilter); 
			processingFilter.Add(thresholdFilter); 
			processingFilter.Add(openingFilter); 
			processingFilter.Add(edgesFilter); 
		} 
 
		// Reset detector to initial state 
		public void Reset() 
		{ 
			backgroundFrame.Dispose(); 
			backgroundFrame = null; 
			counter = 0; 
		} 
 
		// Process new frame 
		public void ProcessFrame(ref Bitmap image) 
		{ 
			if (backgroundFrame == null) 
			{ 
				// create initial backgroung image 
				backgroundFrame = grayscaleFilter.Apply(image); 
 
				// just return for the first time 
				return; 
			} 
 
			Bitmap tmpImage; 
 
			// apply the the grayscale file 
			tmpImage = grayscaleFilter.Apply(image); 
 
		 
			if (++counter == 2) 
			{ 
				counter = 0; 
 
				// move background towards current frame 
				moveTowardsFilter.OverlayImage = tmpImage; 
				Bitmap tmp = moveTowardsFilter.Apply(backgroundFrame); 
 
				// dispose old background 
				backgroundFrame.Dispose(); 
				backgroundFrame = tmp; 
			} 
 
			// set backgroud frame as an overlay for difference filter 
			differenceFilter.OverlayImage = backgroundFrame; 
 
			// apply the the filters sequence 
			Bitmap tmpImage2 = processingFilter.Apply(tmpImage); 
			tmpImage.Dispose(); 
 
			// extract red channel from the original image 
			Bitmap redChannel = extrachChannel.Apply(image); 
 
			//  merge red channel with moving object borders 
			mergeFilter.OverlayImage = tmpImage2; 
			Bitmap tmpImage3 = mergeFilter.Apply(redChannel); 
			redChannel.Dispose(); 
			tmpImage2.Dispose(); 
 
			// replace red channel in the original image 
			replaceChannel.ChannelImage = tmpImage3; 
			Bitmap tmpImage4 = replaceChannel.Apply(image); 
			tmpImage3.Dispose(); 
 
			image.Dispose(); 
			image = tmpImage4; 
		} 
	} 
}