www.pudn.com > motion_src.zip > MotionDetector1.cs


namespace motion 
{ 
	using System; 
	using System.Drawing; 
 
	using Tiger.Imaging; 
	using Tiger.Imaging.Filters; 
 
	///  
	/// MotionDetector1 
	///  
	public class MotionDetector1 : IMotionDetector 
	{ 
		private IFilter	grayscaleFilter = new GrayscaleBT709(); 
		private Difference differenceFilter = new Difference(); 
		private IFilter thresholdFilter = new Threshold(15, 255); 
		private IFilter erosionFilter = new Erosion(); 
		private Merge mergeFilter = new Merge(); 
 
		private IFilter extrachChannel = new ExtractChannel(RGB.R); 
		private ReplaceChannel replaceChannel = new ReplaceChannel(RGB.R); 
 
		private FiltersSequence	processingFilter = new FiltersSequence(); 
 
		private Bitmap	backgroundFrame; 
 
		// Constructor 
		public MotionDetector1() 
		{ 
			processingFilter.Add(differenceFilter); 
			processingFilter.Add(thresholdFilter); 
			processingFilter.Add(erosionFilter); 
		} 
 
		// Reset detector to initial state 
		public void Reset() 
		{ 
			backgroundFrame.Dispose(); 
			backgroundFrame = null; 
		} 
 
		// 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); 
 
			// set backgroud frame as an overlay for difference filter 
			differenceFilter.OverlayImage = backgroundFrame; 
 
			// apply the the filters sequence 
			Bitmap tmpImage2 = processingFilter.Apply(tmpImage); 
 
			// dispose old background 
			backgroundFrame.Dispose(); 
			// set backgound to current 
			backgroundFrame = tmpImage; 
 
			// extract red channel from the original image 
			Bitmap redChannel = extrachChannel.Apply(image); 
 
			//  merge red channel with moving object 
			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; 
		} 
	} 
}