Hi all,
I'm using AForge.net framework, with a static camera shoots on a empty space and able to detect unwanted stuffs being thrown there and also able to detect fire. How can i save a reference image of a clear background & stream images from the sample video? Can anyone please help me in this?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using AForge;
using AForge.Robotics.Lego;
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Imaging;
using AForge.Imaging.Filters;
namespace FireAlertSystem
{
public partial class MainForm : Form
{
LegoCamera.SecurityPanel secondForm = new LegoCamera.SecurityPanel();
private System.Media.SoundPlayer myPlayer;
private const int statLength = 15;
private int statIndex = 0;
private int statReady = 0;
private int[] statCount = new int[statLength];
private FilterInfoCollection videoDevices;
private Thread thread = null;
private AutoResetEvent needToDriveEvent = null;
private bool needToExit = false;
private float panMotorPower = 0;
private float tiltMotorPower = 0;
private float lastPanMotorPower = 0;
private float lastTiltMotorPower = 0;
ColorFiltering colorFilter = new ColorFiltering( );
GrayscaleBT709 grayscaleFilter = new GrayscaleBT709( );
BlobCounter blobCounter = new BlobCounter( );
public MainForm( )
{
InitializeComponent( );
blobCounter.MinWidth = 25;
blobCounter.MinHeight = 25;
blobCounter.FilterBlobs = true;
blobCounter.ObjectsOrder = ObjectsOrder.Size;
try
{
videoDevices = new FilterInfoCollection( FilterCategory.VideoInputDevice );
if ( videoDevices.Count == 0 )
throw new ApplicationException( );
foreach ( FilterInfo device in videoDevices )
{
camerasCombo.Items.Add( device.Name );
}
camerasCombo.SelectedIndex = 0;
}
catch ( ApplicationException )
{
camerasCombo.Items.Add( "No local capture devices" );
videoDevices = null;
}
EnableConnectionControls( false );
predefinedColorsCombo.SelectedIndex = 0;
}
private void MainForm_FormClosing( object sender, FormClosingEventArgs e )
{
Disconnect( );
}
private void connectButton_Click( object sender, EventArgs e )
{
if ( Connect( ) )
{
EnableConnectionControls( true );
}
}
private void disconnectButton_Click( object sender, EventArgs e )
{
Disconnect( );
EnableConnectionControls( false );
}
private void EnableConnectionControls( bool enable )
{
camerasCombo.Enabled = ( ( !enable ) && ( videoDevices != null ) );
connectButton.Enabled = ( ( !enable ) && ( videoDevices != null ) );
disconnectButton.Enabled = enable;
panController.Enabled = enable;
tiltController.Enabled = enable;
}
private void predefinedColorsCombo_SelectedIndexChanged( object sender, EventArgs e )
{
bool enableCustomConfiguration = ( predefinedColorsCombo.SelectedIndex == predefinedColorsCombo.Items.Count - 1 );
redMinUpDown.Enabled = enableCustomConfiguration;
redMaxUpDown.Enabled = enableCustomConfiguration;
greenMinUpDown.Enabled = enableCustomConfiguration;
greenMaxUpDown.Enabled = enableCustomConfiguration;
blueMinUpDown.Enabled = enableCustomConfiguration;
blueMaxUpDown.Enabled = enableCustomConfiguration;
switch ( predefinedColorsCombo.SelectedIndex )
{
case 0:
redMinUpDown.Value = 140;
redMaxUpDown.Value = 255;
greenMinUpDown.Value = 0;
greenMaxUpDown.Value = 100;
blueMinUpDown.Value = 0;
blueMaxUpDown.Value = 100;
break;
case 1:
redMinUpDown.Value = 0;
redMaxUpDown.Value = 100;
greenMinUpDown.Value = 0;
greenMaxUpDown.Value = 100;
blueMinUpDown.Value = 100;
blueMaxUpDown.Value = 255;
break;
default:
redMinUpDown.Value = 0;
redMaxUpDown.Value = 255;
greenMinUpDown.Value = 0;
greenMaxUpDown.Value = 255;
blueMinUpDown.Value = 0;
blueMaxUpDown.Value = 255;
break;
}
}
private void redMinUpDown_ValueChanged( object sender, EventArgs e )
{
colorFilter.Red = new IntRange(
Convert.ToInt32( redMinUpDown.Value ), Convert.ToInt32( redMaxUpDown.Value ) );
}
private void redMaxUpDown_ValueChanged( object sender, EventArgs e )
{
colorFilter.Red = new IntRange(
Convert.ToInt32( redMinUpDown.Value ), Convert.ToInt32( redMaxUpDown.Value ) );
}
private void greenMinUpDown_ValueChanged( object sender, EventArgs e )
{
colorFilter.Green = new IntRange(
Convert.ToInt32( greenMinUpDown.Value ), Convert.ToInt32( greenMaxUpDown.Value ) );
}
private void greenMaxUpDown_ValueChanged( object sender, EventArgs e )
{
colorFilter.Green = new IntRange(
Convert.ToInt32( greenMinUpDown.Value ), Convert.ToInt32( greenMaxUpDown.Value ) );
}
private void blueMinUpDown_ValueChanged( object sender, EventArgs e )
{
colorFilter.Blue = new IntRange(
Convert.ToInt32( blueMinUpDown.Value ), Convert.ToInt32( blueMaxUpDown.Value ) );
}
private void blueMaxUpDown_ValueChanged( object sender, EventArgs e )
{
colorFilter.Blue = new IntRange(
Convert.ToInt32( blueMinUpDown.Value ), Convert.ToInt32( blueMaxUpDown.Value ) );
}
private bool Connect( )
{
Disconnect( );
VideoCaptureDevice videoSource = new VideoCaptureDevice( videoDevices[camerasCombo.SelectedIndex].MonikerString );
videoSource.DesiredFrameSize = new Size( 320, 240);
videoSource.DesiredFrameRate = 15;
videoSourcePlayer.VideoSource = videoSource;
videoSourcePlayer.Start( );
needToDriveEvent = new AutoResetEvent( false );
needToExit = false;
thread = new Thread( new ThreadStart( WorkerThread ) );
thread.Start( );
return true;
}
private void Disconnect( )
{
if ( thread != null )
{
needToExit = true;
needToDriveEvent.Set( );
thread.Join( );
needToDriveEvent.Close( );
needToDriveEvent = null;
thread = null;
}
videoSourcePlayer.SignalToStop( );
videoSourcePlayer.WaitForStop( );
}
private void panController_PositionChanged( float position )
{
panMotorPower = -position;
needToDriveEvent.Set( );
}
private void tiltController_PositionChanged( float position )
{
tiltMotorPower = -position;
needToDriveEvent.Set( );
}
private void WorkerThread( )
{
float newPanMotorPower = 0;
float newTiltMotorPower = 0;
while ( true )
{
needToDriveEvent.WaitOne( );
if ( needToExit )
{
SetMotorPowers( 0, 0 );
break;
}
lock ( this )
{
newPanMotorPower = panMotorPower;
newTiltMotorPower = tiltMotorPower;
}
SetMotorPowers( newPanMotorPower, newTiltMotorPower );
}
}
private void SetMotorPowers( float panMotorPower, float tiltMotorPower )
{
if ( panMotorPower != lastPanMotorPower )
{
lastPanMotorPower = panMotorPower;
int power = (int) ( 5 * panMotorPower + 55 * Math.Sign( panMotorPower ) );
NXTBrick.MotorState motorsState = new NXTBrick.MotorState( );
if ( power == 0 )
{
motorsState.Mode = NXTBrick.MotorMode.None;
motorsState.RunState = NXTBrick.MotorRunState.Idle;
}
else
{
motorsState.Mode = NXTBrick.MotorMode.On;
motorsState.RunState = NXTBrick.MotorRunState.Running;
motorsState.TachoLimit = 0;
motorsState.Power = power;
motorsState.TurnRatio = 80;
}
}
if ( tiltMotorPower != lastTiltMotorPower )
{
lastTiltMotorPower = tiltMotorPower;
int power = (int) ( 5 * tiltMotorPower + 55 * Math.Sign( tiltMotorPower ) );
NXTBrick.MotorState motorsState = new NXTBrick.MotorState( );
if ( power == 0 )
{
motorsState.Mode = NXTBrick.MotorMode.None;
motorsState.RunState = NXTBrick.MotorRunState.Idle;
}
else
{
motorsState.Mode = NXTBrick.MotorMode.On;
motorsState.RunState = NXTBrick.MotorRunState.Running;
motorsState.TachoLimit = 0;
motorsState.Power = power;
motorsState.TurnRatio = 80;
}
}
}
private void videoSourcePlayer_NewFrame( object sender, ref Bitmap image )
{
if ( detectionCheck.Checked )
{
bool showOnlyObjects = onlyObjectsCheck.Checked;
Bitmap objectsImage = null;
if ( showOnlyObjects )
{
objectsImage = image;
colorFilter.ApplyInPlace( image );
}
else
{
objectsImage = colorFilter.Apply( image );
}
BitmapData objectsData = objectsImage.LockBits( new Rectangle( 0, 0, image.Width, image.Height ),
ImageLockMode.ReadOnly, image.PixelFormat );
UnmanagedImage grayImage = grayscaleFilter.Apply( new UnmanagedImage( objectsData ) );
objectsImage.UnlockBits( objectsData );
blobCounter.ProcessImage( grayImage );
Rectangle[] rects = blobCounter.GetObjectsRectangles( );
if ( rects.Length > 0 )
{
Rectangle objectRect = rects[0];
Graphics g = Graphics.FromImage( image );
using ( Pen pen = new Pen( Color.FromArgb( 16, 255, 160 ), 3 ) )
{
g.DrawRectangle( pen, objectRect );
}
g.Dispose( );
if ( trackingCheck.Checked )
{
int objectX = objectRect.X + objectRect.Width / 2 - image.Width / 2;
int objectY = image.Height / 2 - ( objectRect.Y + objectRect.Height / 2 );
panMotorPower = (float) -( ( ( Math.Abs( objectX ) > 30 ) ? 0.3 : 0.0 ) * Math.Sign( objectX ) );
tiltMotorPower = (float) ( ( ( Math.Abs( objectY ) > 30 ) ? 0.5 : 0.0 ) * Math.Sign( objectY ) );
}
else
{
panMotorPower = 0;
tiltMotorPower = 0;
}
}
else
{
if ( trackingCheck.Checked )
{
panMotorPower = 0;
tiltMotorPower = 0;
}
}
needToDriveEvent.Set( );
if ( !showOnlyObjects )
{
objectsImage.Dispose( );
}
grayImage.Dispose();
}
DateTime now = DateTime.Now;
Graphics c = Graphics.FromImage(image);
SolidBrush brush = new SolidBrush(Color.Red);
c.DrawString(now.ToString(), this.Font, brush, new PointF(10, 10));
brush.Dispose();
c.Dispose();