www.pudn.com > motion.zip > MainForm.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using videosource;
namespace motion
{
///
/// Summary description for MainForm
///
public class MainForm : System.Windows.Forms.Form
{
// statistics
private const int statLength = 15;
private int statIndex = 0, statReady = 0;
private int[] statCount = new int[statLength];
private IMotionDetector detector = new MotionDetector3Optimized();
private int detectorType = 4;
private System.Windows.Forms.MenuItem fileItem;
private System.Windows.Forms.MenuItem openFileItem;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem exitFileItem;
private System.Windows.Forms.OpenFileDialog ofd;
private System.Windows.Forms.MainMenu mainMenu;
private System.Timers.Timer timer;
private System.Windows.Forms.StatusBar statusBar;
private System.Windows.Forms.StatusBarPanel fpsPanel;
private System.Windows.Forms.Panel panel;
private motion.CameraWindow cameraWindow;
private System.Windows.Forms.MenuItem motionItem;
private System.Windows.Forms.MenuItem noneMotionItem;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.MenuItem detector1MotionItem;
private System.Windows.Forms.MenuItem detector2MotionItem;
private System.Windows.Forms.MenuItem detector3MotionItem;
private System.Windows.Forms.MenuItem detector3OptimizedMotionItem;
private System.Windows.Forms.MenuItem openURLFileItem;
private System.Windows.Forms.MenuItem openMMSFileItem;
private System.Windows.Forms.MenuItem openLocalFileItem;
private System.Windows.Forms.MenuItem openMJEPGFileItem;
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
public MainForm()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(MainForm));
this.mainMenu = new System.Windows.Forms.MainMenu();
this.fileItem = new System.Windows.Forms.MenuItem();
this.openFileItem = new System.Windows.Forms.MenuItem();
this.openURLFileItem = new System.Windows.Forms.MenuItem();
this.openMMSFileItem = new System.Windows.Forms.MenuItem();
this.openLocalFileItem = new System.Windows.Forms.MenuItem();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.exitFileItem = new System.Windows.Forms.MenuItem();
this.motionItem = new System.Windows.Forms.MenuItem();
this.noneMotionItem = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();
this.detector1MotionItem = new System.Windows.Forms.MenuItem();
this.detector2MotionItem = new System.Windows.Forms.MenuItem();
this.detector3MotionItem = new System.Windows.Forms.MenuItem();
this.detector3OptimizedMotionItem = new System.Windows.Forms.MenuItem();
this.ofd = new System.Windows.Forms.OpenFileDialog();
this.timer = new System.Timers.Timer();
this.statusBar = new System.Windows.Forms.StatusBar();
this.fpsPanel = new System.Windows.Forms.StatusBarPanel();
this.panel = new System.Windows.Forms.Panel();
this.cameraWindow = new motion.CameraWindow();
this.openMJEPGFileItem = new System.Windows.Forms.MenuItem();
((System.ComponentModel.ISupportInitialize)(this.timer)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.fpsPanel)).BeginInit();
this.panel.SuspendLayout();
this.SuspendLayout();
//
// mainMenu
//
this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.fileItem,
this.motionItem});
//
// fileItem
//
this.fileItem.Index = 0;
this.fileItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.openFileItem,
this.openURLFileItem,
this.openMJEPGFileItem,
this.openMMSFileItem,
this.openLocalFileItem,
this.menuItem1,
this.exitFileItem});
this.fileItem.Text = "&File";
//
// openFileItem
//
this.openFileItem.Index = 0;
this.openFileItem.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
this.openFileItem.Text = "&Open";
this.openFileItem.Click += new System.EventHandler(this.openFileItem_Click);
//
// openURLFileItem
//
this.openURLFileItem.Index = 1;
this.openURLFileItem.Text = "Open JPEG &URL";
this.openURLFileItem.Click += new System.EventHandler(this.openURLFileItem_Click);
//
// openMMSFileItem
//
this.openMMSFileItem.Index = 3;
this.openMMSFileItem.Text = "Open &MMS Stream";
this.openMMSFileItem.Click += new System.EventHandler(this.openMMSFileItem_Click);
//
// openLocalFileItem
//
this.openLocalFileItem.Index = 4;
this.openLocalFileItem.Text = "Open &Local Device";
this.openLocalFileItem.Click += new System.EventHandler(this.openLocalFileItem_Click);
//
// menuItem1
//
this.menuItem1.Index = 5;
this.menuItem1.Text = "-";
//
// exitFileItem
//
this.exitFileItem.Index = 6;
this.exitFileItem.Text = "E&xit";
this.exitFileItem.Click += new System.EventHandler(this.exitFileItem_Click);
//
// motionItem
//
this.motionItem.Index = 1;
this.motionItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.noneMotionItem,
this.menuItem2,
this.detector1MotionItem,
this.detector2MotionItem,
this.detector3MotionItem,
this.detector3OptimizedMotionItem});
this.motionItem.Text = "&Motion";
this.motionItem.Popup += new System.EventHandler(this.motionItem_Popup);
//
// noneMotionItem
//
this.noneMotionItem.Index = 0;
this.noneMotionItem.Text = "&None";
this.noneMotionItem.Click += new System.EventHandler(this.noneMotionItem_Click);
//
// menuItem2
//
this.menuItem2.Index = 1;
this.menuItem2.Text = "-";
//
// detector1MotionItem
//
this.detector1MotionItem.Index = 2;
this.detector1MotionItem.Text = "Detector &1";
this.detector1MotionItem.Click += new System.EventHandler(this.detector1MotionItem_Click);
//
// detector2MotionItem
//
this.detector2MotionItem.Index = 3;
this.detector2MotionItem.Text = "Detector &2";
this.detector2MotionItem.Click += new System.EventHandler(this.detector2MotionItem_Click);
//
// detector3MotionItem
//
this.detector3MotionItem.Index = 4;
this.detector3MotionItem.Text = "Detector &3";
this.detector3MotionItem.Click += new System.EventHandler(this.detector3MotionItem_Click);
//
// detector3OptimizedMotionItem
//
this.detector3OptimizedMotionItem.Index = 5;
this.detector3OptimizedMotionItem.Text = "Detector 3 - Optimized";
this.detector3OptimizedMotionItem.Click += new System.EventHandler(this.detector3OptimizedMotionItem_Click);
//
// ofd
//
this.ofd.Filter = "AVI files (*.avi)|*.avi";
this.ofd.Title = "Open movie";
//
// timer
//
this.timer.Interval = 1000;
this.timer.SynchronizingObject = this;
this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
//
// statusBar
//
this.statusBar.Location = new System.Drawing.Point(0, 323);
this.statusBar.Name = "statusBar";
this.statusBar.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
this.fpsPanel});
this.statusBar.ShowPanels = true;
this.statusBar.Size = new System.Drawing.Size(408, 22);
this.statusBar.TabIndex = 1;
//
// fpsPanel
//
this.fpsPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
this.fpsPanel.Width = 392;
//
// panel
//
this.panel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.panel.Controls.AddRange(new System.Windows.Forms.Control[] {
this.cameraWindow});
this.panel.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel.Name = "panel";
this.panel.Size = new System.Drawing.Size(408, 323);
this.panel.TabIndex = 2;
//
// cameraWindow
//
this.cameraWindow.AutoSize = true;
this.cameraWindow.BackColor = System.Drawing.SystemColors.AppWorkspace;
this.cameraWindow.Camera = null;
this.cameraWindow.Location = new System.Drawing.Point(41, 38);
this.cameraWindow.Name = "cameraWindow";
this.cameraWindow.Size = new System.Drawing.Size(322, 242);
this.cameraWindow.TabIndex = 1;
//
// openMJEPGFileItem
//
this.openMJEPGFileItem.Index = 2;
this.openMJEPGFileItem.Text = "Open M&JPEG URL";
this.openMJEPGFileItem.Click += new System.EventHandler(this.openMJEPGFileItem_Click);
//
// MainForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(408, 345);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.panel,
this.statusBar});
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Menu = this.mainMenu;
this.Name = "MainForm";
this.Text = "Motion detector";
this.Closing += new System.ComponentModel.CancelEventHandler(this.MainForm_Closing);
((System.ComponentModel.ISupportInitialize)(this.timer)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.fpsPanel)).EndInit();
this.panel.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.Run(new MainForm());
}
// On form closing
private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
CloseFile();
}
// Close the main form
private void exitFileItem_Click(object sender, System.EventArgs e)
{
this.Close();
}
// Open file
private void openFileItem_Click(object sender, System.EventArgs e)
{
if (ofd.ShowDialog() == DialogResult.OK)
{
// create video source
VideoFileSource fileSource = new VideoFileSource();
fileSource.VideoSource = ofd.FileName;
// open it
OpenVideoSource(fileSource);
}
}
// Open URL
private void openURLFileItem_Click(object sender, System.EventArgs e)
{
URLForm form = new URLForm();
form.Description = "Enter URL of an updating JPEG from a web camera:";
form.URLs = new string[]
{
"http://aleksandriacamk1.it.helsinki.fi/axis-cgi/jpg/image.cgi?resolution=320x240",
"http://stareat.it.helsinki.fi/axis-cgi/jpg/image.cgi?resolution=320x240",
"http://194.18.89.220/axis-cgi/jpg/image.cgi?resolution=320x240",
"http://212.247.228.34/axis-cgi/jpg/image.cgi?resolution=352x240"
};
if (form.ShowDialog(this) == DialogResult.OK)
{
// create video source
JPEGSource jpegSource = new JPEGSource();
jpegSource.VideoSource = form.URL;
// open it
OpenVideoSource(jpegSource);
}
}
// Open MJPEG URL
private void openMJEPGFileItem_Click(object sender, System.EventArgs e)
{
URLForm form = new URLForm();
form.Description = "Enter URL of an MJPEG video stream:";
form.URLs = new string[]
{
"http://sun.jerseyinsight.com/trafficbeaumont/nph-update.cgi",
"http://peeper.axisinc.com/nph-manupdate.cgi",
"http://marc15ter.vac.hu/nphMotionJpeg?Resolution=320x240&Quality=Standard",
"http://213.200.232.69:8080/axis-cgi/mjpg/video.cgi?resolution=320x240"
};
if (form.ShowDialog(this) == DialogResult.OK)
{
// create video source
MJPEGSource mjpegSource = new MJPEGSource();
mjpegSource.VideoSource = form.URL;
// open it
OpenVideoSource(mjpegSource);
}
}
// Open MMS
private void openMMSFileItem_Click(object sender, System.EventArgs e)
{
MMSForm form = new MMSForm();
if (form.ShowDialog(this) == DialogResult.OK)
{
// create video source
VideoStream mmsSource = new VideoStream();
mmsSource.VideoSource = form.URL;
// open it
OpenVideoSource(mmsSource);
}
}
// Open local capture device
private void openLocalFileItem_Click(object sender, System.EventArgs e)
{
CaptureDeviceForm form = new CaptureDeviceForm();
if (form.ShowDialog(this) == DialogResult.OK)
{
// create video source
CaptureDevice localSource = new CaptureDevice();
localSource.VideoSource = form.Device;
// open it
OpenVideoSource(localSource);
}
}
// Open video source
private void OpenVideoSource(IVideoSource source)
{
// set busy cursor
this.Cursor = Cursors.WaitCursor;
// close previous file
CloseFile();
// create camera
Camera camera = new Camera(source, detector);
// start camera
camera.Start();
// attach camera to camera window
cameraWindow.Camera = camera;
// reset statistics
statIndex = statReady = 0;
// start timer
timer.Start();
this.Cursor = Cursors.Default;
}
// Close current file
private void CloseFile()
{
Camera camera = cameraWindow.Camera;
if (camera != null)
{
// detach camera from camera window
cameraWindow.Camera = null;
// signal camera to stop
camera.SignalToStop();
// wait for the camera
camera.WaitForStop();
camera = null;
if (detector != null)
detector.Reset();
}
}
// On timer event - gather statistic
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Camera camera = cameraWindow.Camera;
if (camera != null)
{
// get number of frames for the last second
statCount[statIndex] = camera.FramesReceived;
// increment indexes
if (++statIndex >= statLength)
statIndex = 0;
if (statReady < statLength)
statReady++;
float fps = 0;
// calculate average value
for (int i = 0; i < statReady; i++)
{
fps += statCount[i];
}
fps /= statReady;
statCount[statIndex] = 0;
fpsPanel.Text = fps.ToString("F2") + " fps";
}
}
// Remove any motion detectors
private void noneMotionItem_Click(object sender, System.EventArgs e)
{
detector = null;
detectorType = 0;
SetMotionDetector();
}
// Select detector 1
private void detector1MotionItem_Click(object sender, System.EventArgs e)
{
detector = new MotionDetector1();
detectorType = 1;
SetMotionDetector();
}
// Select detector 2
private void detector2MotionItem_Click(object sender, System.EventArgs e)
{
detector = new MotionDetector2();
detectorType = 2;
SetMotionDetector();
}
// Select detector 3
private void detector3MotionItem_Click(object sender, System.EventArgs e)
{
detector = new MotionDetector3();
detectorType = 3;
SetMotionDetector();
}
// Select detector 3 - optimized
private void detector3OptimizedMotionItem_Click(object sender, System.EventArgs e)
{
detector = new MotionDetector3Optimized();
detectorType = 4;
SetMotionDetector();
}
// Update motion detector
private void SetMotionDetector()
{
Camera camera = cameraWindow.Camera;
if (camera != null)
{
camera.Lock();
camera.MotionDetector = detector;
// reset statistics
statIndex = statReady = 0;
camera.Unlock();
}
}
// On "Motion" menu item popup
private void motionItem_Popup(object sender, System.EventArgs e)
{
MenuItem[] items = new MenuItem[]
{
noneMotionItem, detector1MotionItem,
detector2MotionItem, detector3MotionItem, detector3OptimizedMotionItem
};
for (int i = 0; i < items.Length; i++)
{
items[i].Checked = (i == detectorType);
}
}
}
}